1792. 最大平均通过率

分析

  • 题目:
  • 思路:
    • 由于每个班级的通过率随着人数的增加单调递减,所以最大的通过率,必然是前k个人,使用大跟堆,每次取出增益最大的班级进行添加,即可得到最优解。
    • yxc视频讲解

代码

class Solution {
    
    
public:
    double maxAverageRatio(vector<vector<int>>& classes, int extraStudents) {
    
           
    	// 破题点在哪儿呢?最大===>贪心===>堆
        // 尝试 加到每个班级 选择收益最大的 
        int n = classes.size();
        // 经典多路归并问题
        struct Node{
    
    
            double v;
            int a, b;
            bool operator < (const Node& t) const{
    
    
                return v < t.v;
            }
        };
        
        priority_queue<Node> heap;
        
        double sum = 0;
        for(auto &c: classes) {
    
    
            int a = c[1], b = c[0];
            sum += (double) b / a;
            heap.push({
    
    (a-b)/ (a*(a+1.0)), a, b});
        }
        
        while(extraStudents -- ) {
    
    
            auto t = heap.top(); 
            heap.pop();
            int a = t.a + 1, b = t.b + 1;
            sum += t.v;
            heap.push({
    
    (a-b)/ (a*(a+1.0)), a, b});
        }
        
        return sum / n;
    }
};

猜你喜欢

转载自blog.csdn.net/SYaoJun/article/details/120961921