题目链接:最大平均通过率(贪心+优先队列)
题解:
思路 贪心: 每次添加都要让最大平均通过率的增加量最大.
数据结构: 大根堆
算法: 建一个以 x+1/y+1 -x/y大小作为优先级的大根堆. 然后往堆中添加 int[]类型数据. 每次从堆中取出元素.然后将这个元素的 x,y 都加一 放回 同时 额外学生数-- 直到额外学生分配完成.
时间复杂度: nlogn
代码:
class Solution {
public double maxAverageRatio(int[][] classes, int extraStudents) {
int num=classes.length;
PriorityQueue<int []> priorityQueue=new PriorityQueue<>(new Comparator<int[]>() {
@Override
public int compare(int[] o1, int[] o2) {
return 1.0*(o2[1]-o2[0])/((o2[1]+1)*o2[1])-1.0*(o1[1]-o1[0])/(o1[1]*(o1[1]+1))>0?1:-1;
}
});
for (int[] aClass : classes) {
priorityQueue.add(aClass);
}
while (extraStudents!=0){
int[] temp=priorityQueue.poll();
temp[0]++;
temp[1]++;
priorityQueue.add(temp);
extraStudents--;
}
double ans=0;
for (int[] aClass : classes) {
ans+=1.0*aClass[0]/aClass[1];
}
return ans/num;
}
}