1 Star 1 Fork 0

bensonrachel/Atcoder_algorithm

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
(step2)G. Student Councils (CF).py 2.43 KB
一键复制 编辑 原始数据 按行查看 历史
# -*- 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))
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/bensonrachel/atcoder_algorithm.git
git@gitee.com:bensonrachel/atcoder_algorithm.git
bensonrachel
atcoder_algorithm
Atcoder_algorithm
master

搜索帮助