周赛是越来越简单了吗
唯一一次四题都有思路,但是没有AC。。。
第一题:5952 环和杆
class Solution {
public:
int countPoints(string rings) {
map<char,set<char>>mp;
for(int i = 0; i < rings.size(); i++)
{
mp[rings[i+1]].insert(rings[i]);
}
int ans = 0;
for(int i = 0; i < 10; i++)
{
if(mp['0' + i].size() != 0)
{
ans += mp['0' + i].size() == 3 ? 1 : 0;
}
}
return ans;
}
};
第二题:5953 子数组范围和
class Solution {
public:
long long subArrayRanges(vector<int>& nums) {
//sort(nums.begin(), nums.end());
long long ans = 0;
for(int i = 0; i < nums.size(); i++)
{
int ma = nums[i], mi = nums[i];
for(int j = i + 1; j < nums.size(); j++)
{
ma = max(ma, nums[j]);
mi = min(mi, nums[j]);
ans += ma-mi;
}
}
return ans;
}
};
第三题:5954 给植物浇水 二
class Solution {
public:
int minimumRefill(vector<int>& p, int capacityA, int capacityB) {
int ans = 0;
int n = p.size();
int ca = capacityA,cb = capacityB;
int l = 0, r = n-1;
//int b = n%2 == 0 ? n/2+1 : n/2;
for(int i = 0; i < n/2; i++,l++){
if(ca >= p[l]){ca-=p[l];}
else{
int c = (p[l] % capacityA == 0 ? p[l] / capacityA : p[l] / capacityA + 1);
ans += c;
ca = capacityA*c - p[l];
}
}
for(int i = 0; i < n/2; i++,r--){
if(cb >= p[r]){cb-=p[r];}
else{
int c = (p[r] % capacityB == 0 ? p[r] / capacityB : p[r] / capacityB + 1);
ans += c;
cb = capacityB*c - p[r];
}
}
if(n%2){
if(ca >= cb){
if(ca < p[n/2])ans += (p[n/2] % capacityA == 0 ? p[n/2] / capacityA : p[n/2] / capacityA + 1);
}
else {
if(cb < p[n/2])ans += (p[n/2] % capacityB == 0 ? p[n/2] / capacityB : p[n/2] / capacityB + 1);
}
}
return ans;
}
};
第四题:5955摘水果(参考坑神的代码才写出来)
class Solution {
public:
int sum[200007]={0};
int ma = 0;
int get(int l, int r)
{
int right = 0,left = 0;
if(l > ma)return 0;
if(r < 0)return 0;
if(r > ma)r = ma;
right = sum[r]; left = 0;
if(l - 1 >= 0) left = sum[l-1];
return right - left;
}
int maxTotalFruits(vector<vector<int>>& fruits, int startPos, int k) {
int n = fruits.size();
int ans = 0;
for(int i = 0; i < n; i++)ma = max(ma,fruits[i][0]);
for(int i = 0; i < ma; i++)sum[i] = 0;
for(int i = 0; i < n; i++)sum[fruits[i][0]] += fruits[i][1];
for(int i = 1; i <= ma; i++)sum[i] = sum[i] + sum[i-1];
ans = max(get(startPos-k, startPos),get(startPos, startPos+k));//往左走和往右走的最大值
for(int i = 0; i + i <= k; i++)
{
ans = max(ans, get(startPos-i, startPos+k-i-i));
ans = max(ans, get(startPos-(k-i-i), startPos+i));
}
return ans;
}
};
希望下次能AC