【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

回头补。

posted on 2022-06-02 13:23  damnglamour  阅读(24)  评论(0)    收藏  举报