LeetCode-1792. 最大平均通过率【堆,优先队列,贪心】

news/2024/7/8 2:03:44

LeetCode-1792. 最大平均通过率【堆,优先队列,贪心】

  • 题目描述:
  • 解题思路一:优先队列。首先任何一个班级(x,y)加入一个聪明的学生之后增加的通过率为diff=(x+1)/(y+1)-x/y。那么对p进行堆排序,每次取最大的即可。
  • 解题思路二:0
  • 解题思路三:0

题目描述:

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

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

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

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

示例 1:

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

示例 2:

输入:classes = [[2,4],[3,9],[4,5],[2,10]], extraStudents = 4
输出:0.53485

提示:

1 <= classes.length <= 10^5
classes[i].length == 2
1 <= passi <= totali <= 10^5
1 <= extraStudents <= 10^5
https://leetcode.cn/problems/maximum-average-pass-ratio/description/

解题思路一:优先队列。首先任何一个班级(x,y)加入一个聪明的学生之后增加的通过率为diff=(x+1)/(y+1)-x/y。那么对p进行堆排序,每次取最大的即可。

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;//注意将x由int转为double
        };//加入一个聪明的学生能够增加的通过率
        double res=0;
        for(auto c:classes){
            res+=(double)c[0]/c[1];//注意将x由int转为double
            q.emplace(diff(c[0],c[1]),c[0],c[1]);
        }//首先计算未加入聪明的学生的总通过率与更新优先队列
        while(extraStudents--){
            auto [d,x,y]=q.top();q.pop();
            res+=d;//加入聪明的学生之后增加的通过率
            q.emplace(diff(x+1,y+1),x+1,y+1);
        }
        return res/classes.size();
    }
};

时间复杂度:O((n+m)log⁡n)//其中 n为 classes的长度,m 等于 extraStudents。每次从优先队列中取出或者放入元素的时间复杂度为 O(log⁡n),共需操作 O(n+m)次,故总复杂度为 O((n+m)log⁡n)。
空间复杂度:O(n)//优先队列

解题思路二:0


解题思路三:0



http://lihuaxi.xjx100.cn/news/903448.html

相关文章

19 pandas 分层索引与计算

文章目录分层设置与查询数据index 为有序index 为无序(中文&#xff09;查看数据示例多层索引的创建方式&#xff08;行&#xff09;1、from_arrays 方法2、from_tuples 方法3、from_product 方法多层索引的创建方式&#xff08;列&#xff09;分层索引计算MultiIndex 参数表分…

Linux下的Jenkins安装教程

当前环境 CentOS 7.8Java 11&#xff08;注意当前jenkins支持的Java版本最低为Java11&#xff09;FinalShell 3.9&#xff08;操作环境&#xff09; 安装Jenkins PS&#xff1a;不建议使用Docker安装Jenkins&#xff0c;因为使用Jenkins的时候一般会调用外部程序&#xff0c;…

RabbitMQ 入门到应用 ( 五 ) 应用

6.更多应用 6.1.AmqpAdmin 工具类 可以通过Spring的Autowired 注入 AmqpAdmin 工具类 , 通过这个工具类创建 队列, 交换机及绑定 import org.springframework.amqp.core.AmqpAdmin; import org.springframework.amqp.core.Binding; import org.springframework.amqp.core.Di…

华为OD机试 - 静态扫描最优成本(JS)

静态扫描最优成本 题目 静态扫描快速识别源代码的缺陷,静态扫描的结果以扫描报告作为输出: 文件扫描的成本和文件大小相关,如果文件大小为 N ,则扫描成本为 N 个金币扫描报告的缓存成本和文件大小无关,每缓存一个报告需要 M 个金币扫描报告缓存后,后继再碰到该文件则不…

linux018之安装mysql

linux上安装mysql&#xff1a; 第一步&#xff1a;查看是否已经安装mariadb&#xff0c;mariadb是mysql数据库的分支&#xff0c;mariadb和mysql一起安装会有冲突&#xff0c;所以需要卸载掉。 yum list installed | grep mariadb &#xff1a;查看是否安装mariadb&#xff0c;…

适合初学者的超详细实用调试技巧(上)

我们日常写代码的时候&#xff0c;常常会遇到bug的情况&#xff0c;这个时候像我这样的初学者就会像无头苍蝇一样这里改改那里删删&#xff0c;为了根除这种情况&#xff0c;我最近系统学习了调试的技巧&#xff0c;我想要十分详细地讲解&#xff0c;所以大概不会一篇文章写完。…

169、【动态规划】leetcode ——123. 买卖股票的最佳时机 III:二维数组+一维数组 (C++版本)

题目描述 原题链接&#xff1a;123. 买卖股票的最佳时机 III 解题思路 &#xff08;1&#xff09;二维dp数组 动态规划五步曲&#xff1a; &#xff08;1&#xff09;dp数组含义&#xff1a; dp[i][0]&#xff0c;表示无操作。主要由四个状态来表示四种操作。dp[i][1]&…

手机文字转语音软件哪个好用?超火的两款好用的文字转语音软件

有很多小伙伴对短视频配音比较感兴趣&#xff0c;但方方面面了解得不多&#xff0c;比如&#xff1a;配音有哪几种方法&#xff1f;需要注意些什么&#xff1f;用手机就可以操作么&#xff1f;好用的文字转语音软件有哪些&#xff1f;这篇文&#xff0c;小编就带大家简单了解一…