最大平均通过率

知识点 :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;

    }
};
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值