Loading [MathJax]/jax/output/CommonHTML/jax.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >优先队列与考试

优先队列与考试

作者头像
ACM算法日常
发布于 2021-03-16 07:50:34
发布于 2021-03-16 07:50:34
55200
代码可运行
举报
文章被收录于专栏:ACM算法日常ACM算法日常
运行总次数:0
代码可运行

这次leetcode周赛第三题是一个求平均值的问题,暴力解法容易超时,比较好的做法是通过优先级队列来实现每次的选择,使得复杂度降为

mO(logn)

,是一道很不错的优先级队列问题,在这里分享一下。

题目

一所学校里有一些班级,每个班级里有一些学生,现在每个班都会进行一场期末考试。给你一个二维数组 classes ,其中 classes[i] = [passi, totali] ,表示你提前知道了第 i 个班级总共有 totali 个学生,其中只有 passi 个学生可以通过考试。

给你一个整数 extraStudents ,表示额外有 extraStudents 个聪明的学生,他们 一定 能通过任何班级的期末考。你需要给这 extraStudents 个学生每人都安排一个班级,使得 所有 班级的 平均 通过率 最大 。

一个班级的 通过率 等于这个班级通过考试的学生人数除以这个班级的总人数。平均通过率 是所有班级的通过率之和除以班级数目。

请你返回在安排这 extraStudents 个学生去对应班级后的 最大 平均通过率。与标准答案误差范围在 10-5 以内的结果都会视为正确结果。

示例:

输入:classes = [[1,2],[3,5],[2,2]], extraStudents = 2 输出:0.78333 解释:你可以将额外的两个学生都安排到第一个班级,平均通过率为 (3/4 + 3/5 + 2/2) / 3 = 0.78333 。

题解

首先,「最大化平均通过率」等价于「最大化总通过率」。

设某个班级的人数为

y

,其中可以通过考试的人数为

x

。如果给这个班级安排一个额外的学生,那么该班级的通过率会增加:

x+1y+1xy

在不断地给同一个班级安排学生的过程中,增加的通过率是逐渐单调递减的,即:

每次选择那个可以使得通过率的增加量最大的班级放入一名学生。

思路与算法

表示通过率的增加量。我们将

这一三元组放入优先队列(大根堆)中,随后进行

次操作。

每一次操作中,我们取出优先队列的堆顶元素,其对应着当前通过率的增加量最大的班级。我们将一名学生放入该班级,并将

放回优先队列。

最终我们可以得到「最大的总通过率增加量」,加上初始的总通过率后再除以班级数量即可得到答案。

代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Solution {
public:
    double maxAverageRatio(vector<vector<int>>& classes, int extraStudents) {
        priority_queue<tuple<double, int, int>> q;
        
        auto diff = [](int x, int y) -> double {
            return (double)(x + 1) / (y + 1) - (double)x / y;
        };
        
        double ans = 0.;
        for (const auto& c: classes) {
            int x = c[0], y = c[1];
            ans += (double)x / y;
            q.emplace(diff(x, y), x, y);
        }
        for (int _ = 0; _ < extraStudents; ++_) {
            auto [d, x, y] = q.top();
            q.pop();
            ans += d;
            q.emplace(diff(x + 1, y + 1), x + 1, y + 1);
        }
        return ans / classes.size();
    }
};
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-03-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 ACM算法日常 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
LeetCode 1792. 最大平均通过率(优先队列)
一所学校里有一些班级,每个班级里有一些学生,现在每个班都会进行一场期末考试。 给你一个二维数组 classes ,其中 classes[i] = [passi, totali] ,表示你提前知道了第 i 个班级总共有 totali 个学生,其中只有 passi 个学生可以通过考试。
Michael阿明
2021/09/06
3090
2023-06-22:一所学校里有一些班级,每个班级里有一些学生,现在每个班都会进行一场期末考试 给你一个二维数组 classe
2023-06-22:一所学校里有一些班级,每个班级里有一些学生,现在每个班都会进行一场期末考试
福大大架构师每日一题
2023/07/08
1460
2023-06-22:一所学校里有一些班级,每个班级里有一些学生,现在每个班都会进行一场期末考试 给你一个二维数组 classe
c++优先级队列priority_queue使用lambda表达式出错问题
优先级队列priority_queue,可以在队列中自定义数据的优先级, 让优先级高的排在队列前面优先出队。它具有队列的所有特性,包括队列的基本操作,只是在这基础上添加了内部的一个排序,它本质是一个堆实现的。
杨永贞
2022/05/25
7690
c++优先级队列priority_queue使用lambda表达式出错问题
优先队列的优先级_kafka优先级队列
☺优先队列是一种用来维护一组元素构成的结合S的数据结构,其中每个元素都有一个关键字key,元素之间的比较都是通过key来比较的。优先队列包括最大优先队列和最小优先队列,优先队列的应用比较广泛,比如作业系统中的调度程序,当一个作业完成后,需要在所有等待调度的作业中选择一个优先级最高的作业来执行,并且也可以添加一个新的作业到作业的优先队列中。
全栈程序员站长
2022/10/05
1.5K0
2022.3.5 PAT甲级 2022年春季考试 89分「建议收藏」
这道题空间限制有点严格,如果用C++,只能用优先队列(或者类似方式),而且注意应该是小端优先队列,队列内其实只需要保留5个数,每次加入一个数,就将最小的删去,最后剩下最大的5个数,输出k个数即可。
全栈程序员站长
2022/07/28
2630
数据结构与算法(4)——优先队列和堆什么是优先队列?堆和二叉堆LeetCode相关题目整理
听这个名字就能知道,优先队列也是一种队列,只不过不同的是,优先队列的出队顺序是按照优先级来的;在有些情况下,可能需要找到元素集合中的最小或者最大元素,可以利用优先队列ADT来完成操作,优先队列ADT是一种数据结构,它支持插入和删除最小值操作(返回并删除最小元素)或删除最大值操作(返回并删除最大元素);
我没有三颗心脏
2018/07/24
1.3K0
数据结构与算法(4)——优先队列和堆什么是优先队列?堆和二叉堆LeetCode相关题目整理
c++ stl 优先队列_低优先级队列要等几局
我们传三个参数进去,可以看到优先级队列模板有三个参数,一个是数据类型,一个是被适配的容器,一个是仿函数,仿函数在下面我们 会讲解,一般第二个参数传入的容器需要满足可以随机访问,例如vector和deque。
全栈程序员站长
2022/11/09
6330
c++ stl 优先队列_低优先级队列要等几局
理解堆和优先队列
数据结构中的堆区别于内存分配的堆,我们说的用于排序的堆是一种表示元素集合的结构,堆是一种二叉树。
C语言与CPP编程
2020/12/02
1K0
理解堆和优先队列
C++中priority_queue优先队列
优先队列包含在头文件中。 优先队列是由二项队列编写而成的,可以以log(n)的效率查找一个队列中最大值或最小值(最大值和最小值是由你选择创建的优先队列的性质决定的),这在很多场合可以派上很大的用处,例如prim算法如果结合优先队列可以产生出很好的效果。 priority_queue的模板生命是带有三个参数的:
海盗船长
2020/08/27
5590
分享大厂的一些笔试题目
乐鑫的笔试题是我做过最难的, 后面批次的, 我听说直接和高数相关, 用编程来求解数学问题.
嵌入式与Linux那些事
2021/11/25
1.4K0
UESTC 1599 wtmsb【优先队列+排序】
题目链接:UESTC 1599 wtmsb 题意:给你一组数,每一次取出两个最小的数,将这两个数的和放入这组数中,直到这组数只剩下一个,求最后剩下那个数的大小! 分析:比赛的时候首先我就看到这道题数据是200000,跑时100ms,我把思路捋了一遍,然后讲给旁边人听,一眼看过去,lfh说用哈夫曼树吧,然后找了个板子直接扔上去了, 结果显示出这样的操作:Restricted Function on test 1,从来没见过这个错误啊,百度找了一下,发现这个错误是它oj本身不支持某些函数,比如qsort这种排序
Angel_Kitty
2018/04/09
5340
16万高中生今年没高考,用统计模型估成绩
由于疫情的原因,全球受认可度最高的基础教育组织“国际文凭(IB)在今年5月被迫取消了期末统考。
统计学家
2020/07/22
4530
16万高中生今年没高考,用统计模型估成绩
J - Welcome Party ZOJ - 4109 【 并查集 + 优先队列 + BFS 】
J - Welcome Party ZOJ - 4109  &:这个就是看着题解搞得了,当时想到了优先队列和 BFS ,没有搞把所有的连起来,但是也没有尝试,当时在做字符串那个题,反正各种原因了。言归正传,题目的意思是,给你 n 个人,n 个人有 m 对关系,对于一个人,如果他上场了,发现没有他认识的人,会产生一个值,也就是 ans ++,否则不会产生,问安排上场顺序让 ans 最小,且让上场序列的字典序最小。 &:题解:将 n 个人的 m 对关系来用并查集连起来,合并的时候只往小了合并,让小的先上
Lokinli
2023/03/09
2070
LeetCode 1102. 得分最高的路径(优先队列BFS/极大极小化 二分查找)
给你一个 R 行 C 列的整数矩阵 A。矩阵上的路径从 [0,0] 开始,在 [R-1,C-1] 结束。
Michael阿明
2021/02/19
1.4K0
用编程知识提高工作效率
如果是单线程卡住了,后续任务就无法执行。Java多线程是一个很重要的概念,可以并发执行。
明明如月学长
2021/08/31
3810
用编程知识提高工作效率
c++ 优先队列(priority_queue)的详细讲解用法
在优先队列中,元素被赋予优先级。当访问元素时,具有最高优先级的元素最先删除。优先队列具有最高级先出 的行为特征。
杨鹏伟
2020/09/11
29.6K0
LeetCode LCP 30. 魔塔游戏(优先队列)
小扣当前位于魔塔游戏第一层,共有 N 个房间,编号为 0 ~ N-1。 每个房间的补血道具/怪物对于血量影响记于数组 nums,其中:
Michael阿明
2021/09/06
5010
LeetCode 1086. 前五科的均分(map + 优先队列)
给你一个不同学生的分数列表,请按 学生的 id 顺序 返回每个学生 最高的五科 成绩的 平均分。
Michael阿明
2020/07/13
3600
C++ STL容器之priority_queue(优先队列)快速入门
而且可以在任何时候往优先队列里面加入(push)元素,接着优先队列底层的数据结构堆会随时调整结构,使得每次的队首元素都是优先级最大的。(这里的优先级是可以规定出来的,默认是数字越大优先级越大)
可定
2020/04/20
2.5K0
优先级队列
优先级队列默认使用vector作为其底层存储数据的容器,在vector上又使用了堆算法将vector中元素构造成堆的结构,因此priority_queue就是堆,所有需要用到堆的位置,都可以考虑使用priority_queue。注意:默认情况下priority_queue是大堆
南桥
2024/07/26
1010
优先级队列
推荐阅读
相关推荐
LeetCode 1792. 最大平均通过率(优先队列)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验