5621. 无法吃午餐的学生数量
思维
判断栈中那种三明治比所需人多,找多出来的位置以后便是不可取的
class Solution {
public:
int countStudents(vector<int>& students, vector<int>& sandwiches) {
int n = students.size();
int numa = 0,numb = 0;
int suma = 0,sumb = 0;
for(int i = 0 ; i < n; i ++) {
if(students[i] == 0) numa ++;
else numb ++;
}
for(int j = 0;j < n ; j ++){
if(sandwiches[j] == 0) suma ++;
else sumb ++;
}
int sum = 0;
if(numa == suma) return 0;
else{
int y;
if(numa < suma){
int x = numa;
for(int i = 0;i < n ; i ++){
if(sandwiches[i] == 0) x --;
if(x == 0) y = i;
}
}else{
int x = numb;
for(int i = 0;i < n ; i ++){
if(sandwiches[i] == 1) x --;
if(x == 0) y = i;
}
}
sum = n - 1 - y;
}
return sum;
}
};
5622. 平均等待时间
模拟
class Solution {
public:
double wait[100000 + 10];
double averageWaitingTime(vector<vector<int>>& c) {
int sum = 0;
int n = c.size();
sum = c[0][0];
for(int i = 0 ; i < n ; i++){
if(sum >= c[i][0]){
sum += c[i][1];
wait[i] = sum - c[i][0];
}else{
sum = c[i][0] + c[i][1];
wait[i] = sum - c[i][0];
}
// cout << wait[i] << endl;
}
double num = 0;
for(int i = 0 ; i < n ; i ++){
num += wait[i];
}
double m = double(n);
return num / m;
}
};
5623. 修改后的最大二进制字符串
思维+构造
最前面的1不变,后面的01串都会变成111101111的形式
前面的00 都会变成 10,后面的数多的都可以转换成01111的形式,前后结合形成11110111
class Solution {
public:
string maximumBinaryString(string str) {
int k = 0;
while (k < str.size() && str[k] != '0') k ++ ;//前面1的个数不会发生改变
if (k == str.size()) return str;
int cnt = 0;
for (auto c: str)
if (c == '0')
cnt ++ ;
k += cnt - 1;//后面的0字符串会转成111110形式
return string(k, '1') + '0' + string((int)str.size() - k - 1, '1');//剩下的为1
}
};
5624. 得到连续 K 个 1 的最少相邻交换次数
class Solution {
public:
int minMoves(vector<int>& nums, int k) {
if (k == 1) {
return 0;
}
vector<int> sum = {0};
vector<int> v;
int n = nums.size();
int count = 0;
for (int i = 0; i < n; ++i) {
if (nums[i] == 1) {
v.push_back(i - count);
sum.push_back(sum.back() + v.back());
++count;
}
}
int ans = INT_MAX;
int m = v.size();
for (int i = 0; i + k <= m; ++i) {
int mid = (i + i + k - 1) / 2;
ans = min(ans, v[mid] * (mid - i) - (sum[mid] - sum[i]) + (sum[i + k] - sum[mid + 1]) - v[mid] * (i + k - 1 - mid));
}
return ans;
}
};