堆(优先队列)进阶题

文章讲述了如何使用优先队列(C++中的`priority_queue`)来解决最大平均通过率问题。通过对结构体自定义比较操作符,以优化的顺序存储和处理班级数据,每次从队列中取出增长率最高的班级进行调整。最终计算出在增加一定数量学生后的平均通过率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目一:1792. 最大平均通过率

最大平均通过率
思路:

  1. 使用优先队列完成数据第一次排序。(优先队列与队列的区别在与其优先级,即可以以我们的意愿定义合适的优先级)== 本题中要使得班级j的优先级比班级i的优先级大
    ==
    在这里插入图片描述
    将此式化简为
    在这里插入图片描述
    此时便不得不提
    该数据优先级的定义,毕竟我们我们只有定义优先级才能使得该队列以特定的顺序存储。==而此时我们不能简单的在定义队列时写(greater,less)了,而应定义结构体时使用 bool operato
 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);

注意*‘<’右边便是优先级高的值,其位置更靠前,先弹出.
此式我们每从队列中弹出的数据,经过处理得到的增长率最高)。
c++的默认降序队列
代码

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) {
        double ans=0;
        priority_queue<Ratio>q;
        for(auto &c:classes)
        {
            q.push({c[0],c[1]});
        }
        for(int i=0;i<extraStudents;i++)
        {
            auto[pass,total]=q.top();
            q.pop();
            q.push({pass+1,total+1});
        }
        for(int i=0;i<classes.size();i++)
        {
            auto[pass,total]=q.top();
            q.pop();
            ans+=1.0*pass/total;
        }
        return ans/classes.size();
    }
};
     
   
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值