2023-06-22:一所学校里有一些班级,每个班级里有一些学生,现在每个班都会进行一场期末考试

给你一个二维数组 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。

答案2023-06-22:

大体步骤如下:

1.定义一个结构体 Party 来表示班级的通过情况,结构体包含两个浮点数字段,表示通过考试的学生人数和班级的总人数。

2.实现 Party 结构体的方法 benefit(),计算班级的收益,即通过率的增益。

3.定义一个类型为 PartyHeap 的堆,用于按照班级的收益对班级进行排序。

4.实现 PartyHeap 的方法 Len()Less()Swap(),用于定义堆的行为。

5.实现 PartyHeap 的方法 Push()Pop(),用于向堆中添加和移除元素。

6.定义一个函数 maxAverageRatio(classes [][]int, extraStudents int) float64,接收班级信息和额外学生数量。

7.创建一个空的 PartyHeap 堆。

8.遍历班级信息,将每个班级的通过情况添加到堆中。

9.使用循环将额外的学生分配到班级中。

10.循环堆中的班级,计算平均通过率,累加通过率到变量 all 中。

11.返回平均通过率 all 除以班级数量的浮点数。

时间复杂度:

  • 初始化堆:O(nlogn),其中 n 是班级的数量。初始化堆的时间复杂度是 O(nlogn)。

  • 添加额外学生到班级:O(klogn),其中 k 是额外学生的数量,n 是班级的数量。每次添加一个学生需要进行一次堆操作,堆操作的时间复杂度是 O(logn),因此添加额外学生的总时间复杂度是 O(klogn)。

  • 计算平均通过率:O(nlogn),其中 n 是班级的数量。循环遍历堆中的班级,每次从堆中弹出一个班级,堆操作的时间复杂度是 O(logn),总体时间复杂度为 O(nlogn)。

综上所述,整个算法的时间复杂度是 O(nlogn + klogn)。

空间复杂度:

  • 除了输入的班级和学生信息外,算法使用了一个堆来存储班级信息,堆的空间复杂度是 O(n)。

  • 其他变量和临时存储空间的空间复杂度可以忽略不计。

因此,整个算法的空间复杂度是 O(n)。

go完整代码如下:

package main

import (
"container/heap"
"fmt"
) type Party struct {
pass float64
total float64
} func (p Party) benefit() float64 {
return (p.pass+1)/(p.total+1) - (p.pass / p.total)
} type PartyHeap []Party func (h PartyHeap) Len() int { return len(h) }
func (h PartyHeap) Less(i, j int) bool { return h[i].benefit() > h[j].benefit() }
func (h PartyHeap) Swap(i, j int) { h[i], h[j] = h[j], h[i] } func (h *PartyHeap) Push(x interface{}) {
*h = append(*h, x.(Party))
} func (h *PartyHeap) Pop() interface{} {
old := *h
n := len(old)
x := old[n-1]
*h = old[:n-1]
return x
} func maxAverageRatio(classes [][]int, extraStudents int) float64 {
h := &PartyHeap{}
heap.Init(h) for _, p := range classes {
heap.Push(h, Party{pass: float64(p[0]), total: float64(p[1])})
} for i := 0; i < extraStudents; i++ {
cur := heap.Pop(h).(Party)
cur.pass++
cur.total++
heap.Push(h, cur)
} var all float64 for h.Len() > 0 {
cur := heap.Pop(h).(Party)
all += cur.pass / cur.total
} return all / float64(len(classes))
} func main() {
classes := [][]int{{1, 2}, {3, 5}, {2, 2}}
extraStudents := 2 result := maxAverageRatio(classes, extraStudents)
fmt.Printf("Result: %f\n", result)
}

c++完整代码如下:

#include <iostream>
#include <vector>
#include <queue> struct Party {
double pass;
double total; double benefit() const {
return (pass + 1) / (total + 1) - (pass / total);
}
}; struct PartyCompare {
bool operator()(const Party& p1, const Party& p2) const {
return p1.benefit() < p2.benefit();
}
}; double maxAverageRatio(std::vector<std::vector<int>>& classes, int extraStudents) {
std::priority_queue<Party, std::vector<Party>, PartyCompare> heap; for (const auto& p : classes) {
heap.push({ static_cast<double>(p[0]), static_cast<double>(p[1]) });
} for (int i = 0; i < extraStudents; i++) {
Party cur = heap.top();
heap.pop();
cur.pass += 1;
cur.total += 1;
heap.push(cur);
} double all = 0; while (!heap.empty()) {
Party cur = heap.top();
heap.pop();
all += cur.pass / cur.total;
} return all / classes.size();
} int main() {
std::vector<std::vector<int>> classes = { {1, 2}, {3, 5}, {2, 2} };
int extraStudents = 2; double result = maxAverageRatio(classes, extraStudents);
std::cout << "Result: " << result << std::endl; return 0;
}

2023-06-22:一所学校里有一些班级,每个班级里有一些学生,现在每个班都会进行一场期末考试 给你一个二维数组 classes ,其中 classes[i] = [passi, totali] 表的更多相关文章

  1. Java实验项目二——二维数组实现九九乘法表

    Program:打印乘法口诀表 (1)编写一个方法,参数(二维数组),完成将二维数组中的数据按照行列显示的工作. (2)编写一个测试方法,给出99乘法表,放入到二维数组中,调用(1)中的方法,显示乘法 ...

  2. Java知识系统回顾整理01基础06数组06二维数组

    一.一维数组和二维数组 这是一个一维数组, 里面的每一个元素,都是一个基本类型int int a[] =new int[]{1,2,3,4,5}; 这是一个二维数组,里面的每一个元素,都是一个一维数组 ...

  3. 直接取PHP二维数组里面的值

    具体是这样的,如下一个二维数组,是从库中读取出来的. $user = array( 0 => array( 'id'    => 1, 'name'  => '张三', 'email ...

  4. oracle学习之路(四) ---------PL/SQL 表,二维数组(TABLE)

    LOB类型 ORACLE提供了LOB (Large OBject)类型.用于存储大的数据对象的类型.ORACLE眼下主要支持BFILE, BLOB, CLOB 及 NCLOB 类型. NCLOB 存储 ...

  5. C语言里的指针探析——type *name[] 在函数参数里面,是一个二维指针

    type *name[] 在函数参数里面声明和不在函数里面声明其实不一样. type *name[] 如果在函数参数里声明,则name 是一个二维指针,并不是一个指针数组,而如果不在函数参数里声明,则 ...

  6. sku二维数组里的数组从头到尾叠加组合

    今天工作之余与同事聊天,要是实现一个sku描述里的字段组合的问题.并且实现了请吃饭.哈哈.一顿饭,我和另一位同事积极杠杆的.后来实现了出来. let skuList = [ ['黑色', '白色',' ...

  7. Java 二维数组,排序、切换顺序,查表法二进制十进制,这班查找、排序(冒泡、选择)、遍历,获取最大小值(4)

    Java 二维数组,排序.切换顺序,查表法二进制十进制,折半查找.排序(冒泡.选择).遍历,获取最大小值(4)

  8. C++ 里 构建动态二维数组

    //****动态二维数组 /* int m=3; int **data; int n=2; data=new int*[m]; for(int j=0;j<m;j++) { data[j]=ne ...

  9. SDUT OJ 图练习-BFS-从起点到目标点的最短步数 (vector二维数组模拟邻接表+bfs , *【模板】 )

    图练习-BFS-从起点到目标点的最短步数 Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 在古老的魔兽传说中,有两个军团,一个叫天 ...

  10. 一个有用的排序函数,array_multisort(),下面的一个用法是根据二维数组里的一个字段值的大小,对该二维数组进行重新排序

    从二维数组$cashes中取出一列 'store_id'(二维数组中的每个一维数组都有的字段),按照这个的大小排序,对二维数组$caches里面的一维数组进行重新排序 实际应用如下 想让相同部门的排在 ...

随机推荐

  1. 在Centos8中默认使用DNF没有使用YUM​

    1. 检查DNF版本 检查您的系统上安装的DNF版本. # dnf --version 2. 列出启用的DNF仓库 dnf命令中的'repolist'选项将显示您系统中所有启用的仓库. # dnf r ...

  2. 【Vue原理模拟】模拟Vue实现响应式数据

    1. 预期效果 当数据变动时,触发自定义的回调函数. 2. 思路 对对象 object 的 setter 进行设置,使 setter 在赋值之后执行回调函数 callback(). 3.细节 3.1 ...

  3. IBM Cloud Computing Practitioners 2019 (IBM云计算从业者2019)Exam答案

    Cloud Computing Practitioners 2019 IBM Cloud Computing Practitioners 2019 (IBM云计算从业者2019)Exam答案,加粗的为 ...

  4. 【Spring专题】「技术原理」从源码角度去深入分析关于Spring的异常处理ExceptionHandler的实现原理

    ExceptionHandler的作用 ExceptionHandler是Spring框架提供的一个注解,用于处理应用程序中的异常.当应用程序中发生异常时,ExceptionHandler将优先地拦截 ...

  5. LeeCode数组问题:二分查找

    LeeCode 704 二分查找 题目描述: 给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标, ...

  6. 带你揭开神秘的javascript AST面纱之AST 基础与功能

    作者:京东科技 周明亮 AST 基础与功能 在前端里面有一个很重要的概念,也是最原子化的内容,就是 AST ,几乎所有的框架,都是基于 AST 进行改造运行,比如:React / Vue /Taro ...

  7. FLV文件分析

    很久没看,做下关于FLV文件格式知识点回顾! 一.简单介绍        FLV(Flash Video)是Adobe公司推出的一种媒体封装格式.一个FLV文件,每个Tag类型都属于一个流.也就是说一 ...

  8. Python 使用列表一部分(切片)

    使用列表的一部分(切片) 处理列表的部分元素 切片 指定第一个元素的索引和最后一个元素索引加1 列表名[索引:索引+1] 索引加1:列表中第索引个元素 (左包括右不包括) 未指定索引 列表名[:] 提 ...

  9. 【Visual Leak Detector】在 VS 高版本中使用 VLD

    说明 使用 VLD 内存泄漏检测工具辅助开发时整理的学习笔记. 本篇介绍如何在 VS 高版本中使用 vld2.5.1.同系列文章目录可见 <内存泄漏检测工具>目录 目录 说明 1. 使用前 ...

  10. 试用「ChatGPT」几周之后

    冷静下来,不吹不黑. 01 最近半年,互联网一款现象级的应用诞生:「ChatGPT」: 其火爆的程度,不输前面的羊了个羊: 最初了解到ChatGPT还是春节的时候,但那时网上的测评还没引起足够的好奇心 ...