【2022/02/27-第282场单周赛】复盘

总结

int范围导致了两次WA!!!

Q1.统计包含给定前缀的字符串

RATING:1167

直接STL。

class Solution {
public:
    int prefixCount(vector<string>& words, string pref) {
        int ret = 0;
        for(auto i : words) if(i.find(pref) == 0) ++ret;
        return ret;
    }
};

Q2.使两字符串互为字母异位词的最少步骤数

RATING:1253

直接哈希。

class Solution {
public:
    int minSteps(string s, string t) {
        int h1[26] = {0}, h2[26] = {0};
        for(auto i : s) ++h1[i - 'a'];
        for(auto i : t) ++h2[i - 'a'];
        int ret = 0;
        for(int i = 0; i < 26; ++i) ret += abs(h1[i] - h2[i]);
        return ret;
    }
};

Q3.完成旅途的最少时间

RATING:1641

可以看出随着时间增加,可以完成的躺数是非递减的,所以可以二分。但是要考虑好二分的上界。
题目条件可知,最大可能结果应该为1014,所以上界应该大于1014,但是在二分时,可能的最大temp时间可能为t10^5/2,考虑long long的范围,上界应该小于41014。即[1014,4*10^14]。

class Solution {
public:
    long long minimumTime(vector<int>& time, int totalTrips) {
        long long l = -1, r = 100000000000010;
        function<bool(long long)> check = [&](long long mid) -> bool {
            long long t = 0;
            for(auto i : time) t += mid / i;
            return t >= totalTrips;
        };
        while(l + 1 < r){
            long long mid = (l + r) / 2;
            if(check(mid)) r = mid;
            else l = mid;
        }
        return r;
    }
};

Q4.完成比赛的最少时间

RATING:2315

一眼dp,鉴定为预处理。

class Solution {
public:
    using ll = long long;
    
    int minimumFinishTime(vector<vector<int>>& t, int c, int n) {
        long long dp[n + 1];
        dp[0] = 0;
        for(int i = 1; i <= n; ++i) dp[i] = LONG_LONG_MAX;
        ll fastest[20];
        
        function<ll(ll, ll, ll)> getT = [&](ll f, ll r, ll p) -> int {
            for(int i = 1; i < p; ++i) f *= r;
            return f;
        };
        for(int i = 0; i < 20; ++i) fastest[i] = LONG_LONG_MAX;
        int maxj = 1;
        for(int i = 0; i < t.size(); ++i){
            ll f = t[i][0], r = t[i][1], p = 1, ttime = 0;
            for(int j = 1; j < 20; ++j){
                if(getT(f, r, j) > 300000) break;
                maxj = max(maxj, j);
                ttime += getT(f, r, j);
                fastest[j] = min(fastest[j], ttime);
            }
        }
        //for(int i = 1; i <= maxj; ++i) cout << fastest[i] << ' ';
        //cout << endl;
        // cout << getT(3, 2, 4);
        for(int i = 1; i <= n; ++i){
            int left = max(0, i - maxj);
            for(int l = left; l < i; ++l){
                dp[i] = min(dp[i], dp[l] + c + fastest[i - l]);
            }
            //cout << dp[i] << ' ';
        }
        return dp[n] - c;
    }
};
posted on 2022-05-13 11:05  damnglamour  阅读(28)  评论(0)    收藏  举报