知识点 :priority_queue
解题要点:选中增加一个优秀同学的通过率增量最大的班级
题目
一所学校里有一些班级,每个班级里有一些学生,现在每个班都会进行一场期末考试。给你一个二维数组 classes ,其中 classes[i] = [passi, totali] ,表示你提前知道了第 i 个班级总共有 totali 个学生,其中只有 passi 个学生可以通过考试。
给你一个整数 extraStudents ,表示额外有 extraStudents 个聪明的学生,他们 一定 能通过任何班级的期末考。你需要给这 extraStudents 个学生每人都安排一个班级,使得 所有 班级的 平均 通过率 最大 。
一个班级的 通过率 等于这个班级通过考试的学生人数除以这个班级的总人数。平均通过率 是所有班级的通过率之和除以班级数目。
class Solution {
public:
double compare(const int& p,const int& t){
double r1 = p/(1.0*t);
double r2 = (p+1)/(1.0*(t+1));
return r2-r1;
}
double cal(const int& p,const int& t){
return p/(1.0*t);
}
double maxAverageRatio(vector<vector<int>>& classes, int extraStudents) {
priority_queue<pair<double, int> > q;
int num = classes.size();
for(int i=0;i<num;++i){
q.push(pair<double,int>(compare(classes[i][0],classes[i][1]),i));
// printf("-----------%d,%f\n",i,compare(classes[i][0],classes[i][1]));
}
while(extraStudents){
auto i = q.top().second;
// printf("iiiiiiii--------%d\n",i);
q.pop();
// printf("111111-----------%d,%d,%d\n",i,classes[i][0],classes[i][1]);
classes[i][0]+=1;
classes[i][1]+=1;
// printf("2222-----------%d,%d,%d\n",q.top().second,classes[q.top().second][0],classes[q.top().second][1]);
q.push(pair<double,int>(compare(classes[i][0],classes[i][1]),i));
extraStudents--;
}
double sum=0.0;
for(int i=0;i<num;++i){
printf("-----------%d,%d\n",classes[i][0],classes[i][1]);
sum+=cal(classes[i][0],classes[i][1]);
}
return sum/num;
}
};