用 Python 编写程序来查找最大平均通过率
假设我们有一个班级列表,其中 classes[i] 表示 [pass_i, total_i] 分别表示通过第 i 个班级考试的学生人数和第 i 个班级的学生总数。我们还有另一个值 extra。这表示额外的优秀学生人数,这些学生保证能通过他们被分配到的任何班级的考试。我们必须将每个额外的学生分配到一个班级,以使所有班级的平均通过学生人数最大化。班级的通过率由班级将要通过的学生人数除以班级总学生人数决定。平均通过率是所有班级的通过率总和除以班级数量。我们必须找到分配额外学生后可能的最大平均通过率。
因此,如果输入为 classes = [[2,3],[4,6],[3,3]], extra = 3,则输出将为 0.83809,因为第一节课有两个额外学生,第二节课增加一个额外学生以最大化该比率,所以现在平均值为 (4/5 + 5/7 + 3/3)/3 = 0.83809。
为了解决这个问题,我们将遵循以下步骤 −
h := 类中每对 (a, b) 的元组列表,如 (a/b-(a + 1)/(b + 1), a, b)
heapify h
当 extra 非零时,执行
(v, a, b) := h 的顶部,并从 h 中删除它
(a, b) := (a + 1, b + 1)
将 (-(a + 1) /(b + 1) + a / b, a, b) 插入堆
extra := extra - 1
返回 h 所有元组的平均值
示例
让我们看看下面的实现以便更好地理解 −
import heapq
def solve(classes, extra):
h = [(a / b - (a + 1) / (b + 1), a, b) for a, b in classes]
heapq.heapify(h)
while extra:
v, a, b = heapq.heappop(h)
a, b = a + 1, b + 1
heapq.heappush(h, (-(a + 1) / (b + 1) + a / b, a, b))
extra -= 1
return sum(a / b for v, a, b in h) / len(h)
classes = [[2,3],[4,6],[3,3]]
extra = 3
print(solve(classes, extra))
输入
[[2,3],[4,6],[3,3]], 3
输出
0
相关文章
有用资源
python 参考教程 - 该教程包含有关 python 的更多信息:https://www.cainiaomax.com/python/

