代码拉取完成,页面将自动刷新
# -*- coding: utf-8 -*-
# @project : 《Atcoder》
# @Author : created by bensonrachel on 2021/7/25
# @File : (step2)G. Student Councils (CF).py
# https://codeforces.com/edu/course/2/lesson/6/2/practice/contest/283932/problem/G
# 题目是说:当k(每场会议人数)确定,每组学生的人数确定,寻找一个最大的会议场数,其实也就是寻找一个最大参会人数。
# 给定数字k,每个学生会必须由k名学生组成。重要规则:每个委员会应该由来自不同群体的学生组成。也就是说,同一个小组的两个学生不能在同一个委员会里。
# 当然,每个学生不应该参加超过一个委员会(有些学生可能不参加任何委员会)。
# 一个数组(1 . .给定N],其中a[i]为第i组的学生人数。议会最多可以成立多少个?
"""
def re(mid,rate,k,n):
sum = k*mid
for i in range(n):
sum -= min(rate[i],mid)
return sum <= 0
"""
#两个re是一样的,都能ac
def re(mid, rate, k, n):# 就是每次都是难在这个判断条件怎么写???for each particular group(a[i]) the maximum nums of students can take the slot is min(a[i], x)
sum = 0
for i in range(n):
sum += min(rate[i], mid)
return sum//k >= mid # 原理是每搜寻到一个mid,看最大的可以参会人数是否大于所有目前需要的参会人数,大于的话,就说明这时候的mid(场数)不是最大值
# 这样就不用考虑怎么算怎么组合才有最大的场数的问题,单是这样,解决问题就不用二分了,但是时间复杂度就高很多。
"""
def re(mid,char,k):
a = 0
char.sort(reverse = True)
for i in range(mid):
if(char[k-1]==0):
break
else:
for j in range(k):
char[j] = char[j] - 1
char.sort(reverse = True) 每次之后都要排序一下
a += 1
return a
re(sum(char)//k + 1,char,k)
"""
def bi_SC(char, k, n):# 找不大于的最大值的模板
l = 0
r = sum(char) // k + 1# 右界的值为最大的场数,就是全部人数没有条件地最多分成多少个组。
while (l + 1 < r):
mid = (l + r) // 2
if (re(mid, char, k, n)):
l = mid
else:
r = mid
return l
if __name__ == "__main__":
k = int(input())
n = int(input())
char = []
for _ in range(n):
x = int(input())
char.append(x)
print(bi_SC(char, k, n))
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。