正文索引 [隐藏]
这双周赛改成贪心赛算了,fo了。
A拥有糖果最多的孩子
贪心+暴力。两重循环外层枚举每一个小朋友,内层去找当前的最大糖果数量。如果当前小朋友的糖加上额外给的能大于等于这个最大值就push一个1进去,否则push一个0。
class Solution { public: vector<bool> kidsWithCandies(vector<int>& candies, int extraCandies) { vector<bool> ans; int n = candies.size(); for(int i = 0; i < n; i++) { int maxn = 0; for(int j = 0; j < n; j++) if(i == j) continue; else maxn = max(maxn, candies[j]); if(candies[i] + extraCandies >= maxn) ans.push_back(true); else ans.push_back(false); } return ans; } };
B改变一个整数能得到的最大差值
还是暴力。对每一个数位进行枚举。
三层循环外层枚举a中层枚举b内层枚举每一位。
设临时变量cur为当前数位上的值,如果cur==a就把它换成b。
设target为当前换出来得的数。如果有前导0就令target=0并结束循环。每次枚举数位结束后更新maxn与minn的值并判断操作是否合法,最终答案就是maxn-minn。
class Solution { public: int maxDiff(int num) { int top = 0; int dig[10]; int v = num; while(v) { dig[++top] = v % 10; v /= 10; } int maxn = num; int minn = num; for(int i = 0; i < 10; i++) { for(int j = 0; j < 10; j++) { int tar = 0; for(int k = top; k >= 1; k--) { int cur = dig[k]; if(cur == i) cur = j; if(k == top && cur == 0) { tar = 0; break; } tar = tar * 10 + cur; } if(tar == 0) continue; minn = min(minn, tar); maxn = max(maxn, tar); } } return maxn - minn; } };
C检查一个字符串是否可以打破另一个字符串
题目定义了:
字符串 x 可以”打破”字符串 y 当且仅当对于所有 i 都有x[i] >= y[i]。
其中x==y==n, 0<=i<=n-1, 字符大小按字典序顺序定义。
其实还是贪心。按照题目描述,一个能打破字符串x的字符串y,一定存在一个满足”y的第k大字符>= x的第k大字符”的排列。那按照这个条件,sort两个字符串然后按位比较就行了。
class Solution { public: bool checkIfCanBreak(string s1, string s2) { int n = s1.size(); sort(s1.begin(), s1.end()); sort(s2.begin(), s2.end()); bool check1 = 1; for(int i = 0; i < n; i++) if(s1[i] < s2[i]) { check1 = 0; break; } bool check2 = 1; for(int i = 0; i < n; i++) if(s2[i] < s1[i]) { check2 = 0; break; } if(check1 || check2) return true; else return false; } };
评论
博主优秀
夏目 D题永远不会的蒟蒻不配优秀qaq