【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;
}
};
浙公网安备 33010602011771号