【每日一题Day123】LC1792最大平均通过率 | 堆

news/2024/7/5 7:06:34

最大平均通过率【LC1792】

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

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

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

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

  • 思路:

    • 首先添加每一个学生时,应使通过率的变化值最大,才能获得最大的平均通过率
    • 实现时可以使用大顶堆存储一个二元组,内容各个班级的通过学生和总学生,堆以增加一个通过学生后,通过率的变化值从大到小排序。这样堆顶元素即为添加一个学生通过率变化最大值对应的班级,操作extraStudents次,然后求得最终的平均通过率返回即可
  • 实现

    class Solution {
        public double maxAverageRatio(int[][] classes, int extraStudents) {
            PriorityQueue<double[]> pq = new PriorityQueue<double[]>((o1, o2) -> (o2[0] + 1) / (o2[1] + 1) - o2[0] / o2[1] > (o1[0] + 1) / (o1[1] + 1) - o1[0] / o1[1] ? 1 : -1 );
            for (int[] c : classes){
                pq.add(new double[]{c[0], c[1]});
            }
            for (int i = 0; i < extraStudents; i++){
                double[] c = pq.poll();
                pq.add(new double[]{c[0] + 1, c[1] + 1});
            }
            double res = 0;
            while (!pq.isEmpty()){
                double[] c = pq.poll();
                res += c[0] / c[1];
            }
            return res / classes.length;
        }
    }
    
    • 复杂度
      • 时间复杂度: O ( n + k l o g n ) O(n+klogn) O(n+klogn) n n n为班级数量, k k k为必通过的学生人数,向堆中添加元素的时间复杂度为 O ( l o g n ) O(logn) O(logn)
      • 空间复杂度: O ( n ) O(n) O(n),小顶堆的空间复杂度为 O ( n ) O(n) O(n)

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

相关文章

Linux配置 自启动,碰到一些问题

最近在搞一个arm-linux&#xff0c;发现自动运行与手动运行&#xff0c;竟然效果是不一样&#xff0c;在解决问题的同时&#xff0c;也顺便把Linux启动相关一些知识梳理一遍。 问题1&#xff1a;在/etc/init.d/ 新建一个S90startapp, 并且添加启动程序的路径。 此时&#xff0…

论文投稿指南——中文核心期刊推荐(社会学)

【前言】 &#x1f680; 想发论文怎么办&#xff1f;手把手教你论文如何投稿&#xff01;那么&#xff0c;首先要搞懂投稿目标——论文期刊 &#x1f384; 在期刊论文的分布中&#xff0c;存在一种普遍现象&#xff1a;即对于某一特定的学科或专业来说&#xff0c;少数期刊所含…

剑指Offer专项突击版题解八

71.按权重生成随机数 思考&#xff1a;说到平均的生成随机数&#xff0c;想到了水塘抽样法和彩票调度法。 水塘抽样算法适合于样本不确定&#xff0c;乃至于是变化的&#xff0c;每个样本的概率是一样的。 // 样本nums[],每个元素的被抽到的概率是一样的 index : 0 for i : 1;…

(十五)、从插件市场引入问题反馈页面【uniapp+uinicloud多用户社区博客实战项目(完整开发文档-从零到完整项目)】

1&#xff0c;插件市场问题反馈页面 插件市场链接 dloud插件插件市场中找到问题反馈插件&#xff1a; 首先确保登录了dcloud账号。 使用hbuilderX导入插件到自己项目中。 选择合并导入。 从插件市场导入意见反馈页面的路径地址如下&#xff1a; 2&#xff0c;点击跳转到…

千锋教育嵌入式物联网教程之系统编程篇学习-04

目录 alarm函数 raise函数 abort函数 pause函数 转折点 signal函数 可重入函数 信号集 sigemptyset() sigfillset sigismember()​ sigaddset()​ sigdelset()​ 代码讲解 信号阻塞集 sigprocmask()​ alarm函数 相当于一个闹钟&#xff0c;默认动作是终止调用alarm函数的进…

时序预测 | Python实现TCN时间卷积神经网络时间序列预测

时序预测 | Python实现TCN时间卷积神经网络时间序列预测 目录 时序预测 | Python实现TCN时间卷积神经网络时间序列预测预测效果基本介绍环境准备模型描述程序设计学习小结参考资料预测效果 基本介绍 递归神经网络 (RNN),尤其是 LSTM,非常适合时间序列处理。 作为研究相关技术…

New和Malloc的使用及其差异

1&#xff0c;new的使用关于new的定义&#xff1a;new其实就是告诉计算机开辟一段新的空间&#xff0c;但是和一般的声明不同的是&#xff0c;new开辟的空间在堆上&#xff0c;而一般声明的变量存放在栈上。通常来说&#xff0c;当在局部函数中new出一段新的空间&#xff0c;该…

华为OD机试 - 最短耗时(JS)

最短耗时 题目 给定一个正整型数组表示待系统执行的任务列表, 数组的每一个元素代表一个任务,元素的值表示该任务的类型。 请计算执行完所有任务所需的最短时间。 任务执行规则如下: 任务可以按任意顺序执行,且每个任务执行耗时间均为1个时间单位。两个同类型的任务之间必…