题目描述:
一所学校里有一些班级,每个班级里有一些学生,现在每个班都会进行一场期末考试。给你一个二维数组 classes
,其中 classes[i] = [passi, totali]
,表示你提前知道了第 i
个班级总共有 totali
个学生,其中只有 passi
个学生可以通过考试。
给你一个整数 extraStudents
,表示额外有 extraStudents
个聪明的学生,他们 一定 能通过任何班级的期末考。你需要给这 extraStudents
个学生每人都安排一个班级,使得 所有 班级的 平均 通过率 最大 。
一个班级的 通过率 等于这个班级通过考试的学生人数除以这个班级的总人数。平均通过率 是所有班级的通过率之和除以班级数目。
请你返回在安排这 extraStudents
个学生去对应班级后的 最大 平均通过率。与标准答案误差范围在 10-5
以内的结果都会视为正确结果。
题解:
由于班级总数不变,因此可以把平均通过率最大转化为总通过率最大。
考虑,总是给一个班级分配贡献并不高。
因此我们使用优先队列,使的优先级更高,并执行extraStudent次添加学生操作,最后统计平均通过率即可。
class Solution {
public:
struct Ratio{
int pass,total;
bool operator < (const Ratio & oth) const{
return (long long) (oth.total+1)*(oth.total)*(total-pass)<(long long) (total+1)*total*(oth.total-oth.pass);
}
};
double maxAverageRatio(vector<vector<int>>& classes, int extraStudents) {
priority_queue<Ratio> q;
for(auto x:classes){
q.push({x[0],x[1]});
}
for(int i=1;i<=extraStudents;i++){
auto [pass,total]=q.top();
q.pop();
q.push({pass+1,total+1});
}
double res=0;
for (int i = 0; i < classes.size(); i++){
auto [pass,total]=q.top();
q.pop();
res+=1.0*pass/total;
}
return res/classes.size();
}
};