【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
单调栈+前缀和之前缀和。(回头补)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人