b_lc_最大平均通过率(多路归并思想)
给一个二维数组 classes ,其中 classes[i] = [passi, totali] ,表示第 i 个班级总共有 totali 个学生,其中只有 passi 个学生可以通过考试。
给你一个整数 extraStudents ,表示额外有 extraStudents 个学生一定 能通过任何班级的期末考。给这 extraStudents 个学生每人都安排一个班级,**使得 所有 班级的 平均 通过率 最大 **。
一个班级的 通过率 等于这个班级通过考试的学生人数除以这个班级的总人数。平均通过率 是所有班级的通过率之和除以班级数目。
请你返回在安排这 extraStudents 个学生去对应班级后的 最大 平均通过率。(n<1e5)
思路:让一个有a个学生中b个通过的班级增加一个聪明学生后的通过率的增量为-,a越大,增量越少,故可得不断地给同一个班级添加学生,这个班级通过率增量会减少,故可以用堆来维护多个班级的增量的最大值,每次往增量最大的那个班级添加聪明的学生(也就是大顶堆堆顶班级)
struct node {
int a, b;
double v; //按照增量排序
bool operator<(const node& o) const {
return v < o.v;
}
};
class Solution {
public:
double maxAverageRatio(vector<vector<int>>& classes, int m) {
int n=classes.size();
double s=0;
priority_queue<node, vector<node>> q;
for (auto& c : classes) {
int a=c[1], b=c[0];
s+=(double)b/a;
q.push({a, b, (a-b)/(a*(a+1.0))});
}
while (m--) {
auto t=q.top(); q.pop();
int a=t.a+1, b=t.b+1;
s+=t.v;
q.push({a, b, (a-b)/(a*(a+1.0))});
}
return s/n;
}
};
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
· 现代计算机视觉入门之:什么是图片特征编码
· .NET 9 new features-C#13新的锁类型和语义
· Linux系统下SQL Server数据库镜像配置全流程详解
· Sdcb Chats 技术博客:数据库 ID 选型的曲折之路 - 从 Guid 到自增 ID,再到
· 语音处理 开源项目 EchoSharp
· 《HelloGitHub》第 106 期
· Huawei LiteOS基于Cortex-M4 GD32F4平台移植
· mysql8.0无备份通过idb文件恢复数据过程、idb文件修复和tablespace id不一致处