【2022/03/19-第74场双周赛】复盘

总结
Q2的特殊情况一开始考虑了,但是到写完提交前都忘记了,所以在读题时把所有自己考虑到的特殊情况写到纸上,防止自己疏忽了。第一次提交错误后,改还只改了一半,多了一次WA,也是够了。
Q4提交的时候忘记注释掉测试代码,超时了一次。
Q1.将数组划分成相等数对
就是看有没有个数为奇数的元素。
class Solution {
public:
bool divideArray(vector<int>& nums) {
int h[510] = {0};
for(auto i : nums) ++h[i];
for(int i = 0; i < 510; ++i){
if(h[i] & 1) return false;
}
return true;
}
};
Q2.字符串中最多数目的子字符串
第一次提交错误后,改还只改了一半,多了一次WA,也是够了。
贪心,显然把第一个元素加到最左边或者第二个元素加到最右边可以得到结果。
class Solution {
public:
long long maximumSubsequenceCount(string t, string p) {
char a = p[0], b = p[1];
int rb = 0, la = 0;
for(auto i : t){
if(i == b) ++rb;
}
long long ret = 0, tret = 0;
string temp = a + t;
for(int i = 0; i < temp.size(); ++i){
if(temp[i] == b) --rb;
if(temp[i] == a) tret += rb;
}
ret = max(ret, tret);
tret = 0;
temp = t + b;
for(int i = 0; i < temp.size(); ++i){
if(temp[i] == b) tret += la;
if(temp[i] == a) ++la;
}
ret = max(ret, tret);
return ret;
}
};
Q3.将数组和减半的最少操作次数
贪心,每次都将当前最大的元素减半。
class Solution {
public:
int halveArray(vector<int>& nums) {
double sum = 0, now = 0;
int ret = 0;
priority_queue<double, vector<double>, less<double>> q;
for(auto i : nums){
sum += i;
q.push((double)i);
}
while(now < sum / 2.0){
double k = q.top();
q.pop();
k /= 2;
q.push(k);
now += k;
++ret;
}
return ret;
}
};
Q4.用地毯覆盖后的最少白色砖块
动态规划,用f[i][j]表示从左到右一共考虑了i块地砖,且用了j块地毯时,白地砖的最小值。
当前地砖为黑时,f[i][j] = f[i - 1][j]
当前地砖为白时,f[i][j] = min(f[i - 1][j] + 1, f[max(0, i - clen)][j]);
class Solution {
public:
int minimumWhiteTiles(string floor, int cnum, int clen) {
int n = floor.size();
vector<vector<int>> f(n + 1, vector<int> (cnum + 1, 0));
for(int i = 0; i < n; ++i){
f[i + 1][0] = f[i][0] + (floor[i] == '1');
}
for(int i = 1; i <= n; ++i){
for(int j = 1; j <= cnum; ++j){
if(floor[i - 1] == '0') f[i][j] = f[i - 1][j];
else{
f[i][j] = f[i - 1][j] + 1;
if(i - clen >= 1) f[i][j] = min(f[i][j], f[i - clen][j - 1]);
else f[i][j] = min(f[i][j], f[0][j - 1]);
}
}
}
return f[n][cnum];
}
};
浙公网安备 33010602011771号