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. [ACM]NOIP2011D1T1复现-铺地毯

    逆向考虑即可解决 #include<iostream> using namespace std; const int maxn= 100000 +5; int a[maxn][4];//0 ...

  2. 数据挖掘系统聚类—R实现

    系统聚类法 聚类就是按照某个特定标准把一个数据集分割成不同的类或簇,最后的结果是希望同类之间的差异性尽可能小,不同类之间的差异性尽可能大.不同的类具有能够表达异于其他类的指标,这样针对不同的类,后续就 ...

  3. 0001 嵌入式开发带你从小白到大佬系列之——Linux开发环境搭建—Windows-VMware-Ubuntu环境配置

    如文章标题,我们安装的Linux开发环境是:Windows-VMware-Ubuntu环境 配置,即在windows系统下安装VMware虚拟机,之后在VMware中配置安装Linux系统的常用发行版 ...

  4. 【LeetCode回溯算法#extra01】集合划分问题【火柴拼正方形、划分k个相等子集、公平发饼干】

    火柴拼正方形 https://leetcode.cn/problems/matchsticks-to-square/ 你将得到一个整数数组 matchsticks ,其中 matchsticks[i] ...

  5. 基于Mongodb分布式锁简单实现,解决定时任务并发执行问题

    前言 我们日常开发过程,会有一些定时任务的代码来统计一些系统运行数据,但是我们应用有需要部署多个实例,传统的通过配置文件来控制定时任务是否启动又太过繁琐,而且还经常出错,导致一些异常数据的产生 网上有 ...

  6. 【FAQ】关于华为推送服务因营销消息频次管控导致服务通讯类消息下发失败的解决方案

    一. 问题描述 使用华为推送服务下发IM消息时,下发消息请求成功且code码为80000000,但是手机总是收不到消息: 在华为推送自助分析(Beta)平台查看发现,消息发送触发了频控. 二. 问题原 ...

  7. EasyExcel配置步骤

    1.介绍 EasyExcel是一个基于Java的简单.省内存的读写Excel的开源项目 参考 https://blog.csdn.net/u013044713/article/details/1202 ...

  8. node.js基于react项目打包部署到nginx中(Linux服务器)

    1.首先进入React项目目录. 2.执行npm命令进行打包(生成dist包或build包). npm run build 3.将打包的静态文件放入nginx目录中(可以自己新创建一个目录,也可以放在 ...

  9. 浅谈ArrayList和LinkedList

    文章目录 前言 ArrayList和LinkedList List的方法 ArrayList add remove LinkedList remove get和peek push ArrayList和 ...

  10. 如何理解 Spring Boot 中的 Starter ?

    假如 没有 Spring Boot Starter,我们有两种方式来创建 Spring Bean. spring xml 模式 (远古模式,并不推荐) spring API 来创建 Spring Be ...