1792. 最大平均通过率
Problem: 1792. 最大平均通过率
文章目录
- 思路
- 解题过程
- 复杂度
- Code
思路
优先队列。
分配学生应该分配到班级通过率变化量最大的班级,班级通过率变化量:
∆ = (pass + 1) / (total + 1) - pass / total;
解题过程
将
∆
放入到最大堆中,堆顶为分配到一个extraStudents
后班级通过率变化量最大的班级。
每分配一个学生,重新入队,因为通过计算优秀学生都进入同一班级∆
递减。
复杂度
- 时间复杂度: O(n+mlogn)O(n+mlogn)O(n+mlogn)
- 空间复杂度: O(n)O(n)O(n)
Code
class Solution {
public:// 计算变化量double gain(int pass, int total) {return (double)(pass + 1) / (total + 1) - (double)pass / total;}double maxAverageRatio(vector<vector<int>>& classes, int extraStudents) {priority_queue<pair<double, pair<int, int>>> pq;// 初始化for (auto& c : classes) {pq.push({gain(c[0], c[1]), {c[0], c[1]}});}// 将学生分配,重新入队while (extraStudents--) {auto [g, cls] = pq.top();pq.pop();int pass = cls.first, total = cls.second;pass++;total++;pq.push({gain(pass, total), {pass, total}});}// 计算结果double sum = 0;while (!pq.empty()) {auto [g, cls] = pq.top();pq.pop();sum += (double)cls.first / cls.second;}return (double)sum / classes.size();}
};