随笔 - 40  文章 - 0  评论 - 0  阅读 - 1190

【2022-05-22-第294场单周赛】

总结

Q1.字母在字符串中的百分比

RATING:1162

模拟

class Solution {
public:
int percentageLetter(string s, char letter) {
int n = s.size();
int h[26] = {0};
for(auto i : s) ++h[i - 'a'];
int mx = 0;
return 100 * h[letter - 'a'] / n;
}
};

Q2.装满石头的背包的最大数量

RATING:1249

优先队列存每个背包剩余空间。

class Solution {
public:
int maximumBags(vector<int>& c, vector<int>& r, int ar) {
int ret = 0;
priority_queue<int, vector<int>, greater<int>> q;
for(int i = 0; i < c.size();++i){
q.push(c[i] - r[i]);
}
while(ar > 0 && !q.empty()){
if(ar >= q.top()){
ar -= q.top();
q.pop();
++ret;
}
else break;
}
return ret;
}
};

也可排序+前缀和+二分。

class Solution {
public:
int maximumBags(vector<int>& c, vector<int>& rk, int k) {
int n = c.size();
long long rest[n], ps[n + 1];
ps[0] = 0;
for(int i = 0; i < n; ++i) rest[i] = c[i] - rk[i];
sort(rest, rest + n);
for(int i = 0; i < n; ++i) ps[i + 1] = ps[i] + rest[i];
int l = -1, r = n;
while(l + 1 < r){
int mid = l + r >> 1;
if(ps[mid + 1] <= k) l = mid;
else r = mid;
}
return l + 1;
}
};

Q3.表示一个折线图的最少线段数

RATING:1681

要注意浮点数除法精度问题,一劳永逸的方法就是用乘法。

class Solution {
public:
int minimumLines(vector<vector<int>>& s) {
if(s.size() == 1) return 0;
sort(s.begin(), s.end());
/*vector<double> k;
for(int i = 1; i < s.size(); ++i){
k.push_back((double)((double)s[i][1] - s[i - 1][1]) / ((double)s[i][0] - s[i - 1][0]));
}*/
int ret = 1;
for(int i = 2; i < s.size(); ++i){
long long x1 = s[i - 2][0], y1 = s[i - 2][1], x2 = s[i - 1][0], y2 = s[i - 1][1], x3 = s[i][0], y3
= s[i][1];
if((y3 - y2) * (x1 - x2) != (y1 -y2) * (x3 - x2)) ++ret;
}
return ret;
}
};

Q4.巫师的总力量和

RATING:2621

单调栈+前缀和之前缀和。(回头补)

posted on   damnglamour  阅读(13)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示