# 1792. Maximum Average Pass Ratio ###### tags: `Leetcode` `Medium` `Priority Queue` `Greedy` Link: https://leetcode.com/problems/maximum-average-pass-ratio/ ## 思路 $O(NlogN)$ $O(N)$ 按照增加一个extraStudents对于class的改变量排序 每次往增加最多的class里增加学生 因为average是所有班级的average的总和/班级数 所以对于整体而言 应该把extraStudent加到使 所有班级的average提高最多的 class里 注意这里的priorityqueue不能直接用lambda表达式也就是 ```java Queue<int[]> pq = new PriorityQueue<>((a,b)->((double)(a[0]+1)/(a[1]+1)-(double)(b[0]+1)/(b[1]+1)) ``` 因为如果queue里面item的type和lambda表达式里面的结果不一样会报error 所以需要写成 ```java Queue<int[]> pq = new PriorityQueue<>((a,b)->{ double diff1 = (double)(a[0]+1)/(a[1]+1) - (double)a[0]/a[1]; double diff2 = (double)(b[0]+1)/(b[1]+1) - (double)b[0]/b[1]; if(diff1<diff2) return 1; if(diff1<diff2) return 0; else return -1; }); ``` ## Code java ```java= class Solution { public double maxAverageRatio(int[][] classes, int extraStudents) { Queue<int[]> pq = new PriorityQueue<>((a,b)->{ double diff1 = (double)(a[0]+1)/(a[1]+1) - (double)a[0]/a[1]; double diff2 = (double)(b[0]+1)/(b[1]+1) - (double)b[0]/b[1]; if(diff1<diff2) return 1; if(diff1<diff2) return 0; else return -1; }); for(int[] singleclass:classes) pq.add(singleclass); while(extraStudents!=0){ int[] lowest = pq.poll(); lowest[0]++; lowest[1]++; pq.add(lowest); extraStudents--; } double average = 0; while(!pq.isEmpty()){ average += (double)pq.peek()[0]/pq.peek()[1]; pq.poll(); } return average/classes.length; } } ``` c++ ```cpp= typedef array<double,3> AD3; class Solution { public: double maxAverageRatio(vector<vector<int>>& classes, int extraStudents) { priority_queue<AD3> pq; for(auto c:classes){ double p = c[0]; double t = c[1]; pq.push({(p+1)/(t+1)-p/t, p, t}); } for(int i=0; i<extraStudents; i++){ auto [r,p,t] = pq.top(); pq.pop(); p += 1; t += 1; pq.push({(p+1)/(t+1)-p/t, p, t}); } double ans = 0; while(!pq.empty()){ auto [r,p,t] = pq.top(); pq.pop(); ans += p/t; } return ans/classes.size(); } }; ```