【2022-05-14-第78场双周赛】复盘

总结
Q1.找到一个数字的 K 美丽值
RATING:1280
模拟。
class Solution {
public:
int divisorSubstrings(int num, int k) {
string s = to_string(num);
int ret = 0;
for(int i = 0; i <= s.size() - k; ++i){
int x = stoi(s.substr(i, k));
if(x == 0) continue;
else ret += (num % x == 0);
}
return ret;
}
};
Q2.分割数组的方案数
RATING:1334
前缀和模拟。
class Solution {
public:
int waysToSplitArray(vector<int>& a) {
int n = a.size(), ret = 0;
long long ps[n + 1]; ps[0] = 0;
for(int i = 0; i < n; ++i) ps[i + 1] = ps[i] + a[i];
for(int i = 1; i < n; ++i) if(ps[i] * 2 >= ps[n]) ++ret;
return ret;
}
};
Q3.毯子覆盖的最多白色砖块数
RATING:2022
贪心+排序+前缀和+二分搜索。
把瓷砖区间排序后,枚举每个瓷砖区间,计算当地毯左边缘正好覆盖区间第一块瓷砖时,地毯一共覆盖了多少块瓷砖,取其中最大值。其中求覆盖瓷砖时用前缀和+二分搜索的方法找到地毯正好的瓷砖区间或空地区间。
class Solution {
public:
int maximumWhiteTiles(vector<vector<int>>& tiles, int cl) {
for(auto i : tiles){
if(i[1] - i[0] + 1>= cl) return cl;
}
int n = tiles.size();
sort(tiles.begin(), tiles.end());
int presum[n + 1];
presum[0] = 0;
for(int i = 0; i < n; ++i){
presum[i + 1] = presum[i] + tiles[i][1] - tiles[i][0] + 1;
}
int ret = 0;
for(int i = 0; i < n; ++i){
int l = i - 1, r = n;
while(l + 1 < r){
int mid = (l + r) / 2;
if(tiles[mid][1] < tiles[i][0] + cl - 1) l = mid;
else r = mid;
}
if(r == n){
ret = max(ret, presum[n] - presum[i]);
break;
}
int t = presum[r] -presum[i]+ tiles[i][0] + cl - tiles[r][0];
if(tiles[r][0] <= tiles[i][0] + cl - 1)ret = max(ret, t);
else ret = max(ret, presum[r] - presum[i]);
}
return ret;
}
};
Q4.最大波动的字符串
RATING:2516
回头补。
浙公网安备 33010602011771号