做题思路
最开始的时候,题目说:
请你设计一个食物套餐,对于该套餐:
唯一要求是设计好的套餐必须恰好包含n个食物。
具体包含多少种食物,以及包含哪些种类的食物,不做要求,任你安排。
每种食物具体包含多少个,不做要求,任你安排。
这么看,我理解就是指定了一个套餐必须有多少个食物,种类没要求,种类数量也没要求。
这样看直接m/n就可以了啊。
后面才发现,套餐是固定下来的,设计了一个套餐,后续只能做这个套餐。
然后就很适合二分,直接去计算这个数很麻烦,但是分成两步,第一,判断一个结果满不满足条件很简单;第二,这个结果可以二分;
对于判断一个结果满不满足,在已经确定套餐数量的前提下,计算每一种类可以在套餐里添加食物的数量,如果大于等于n,则说明满足。
python代码
n,m=map(int,input().split())
ans=list(map(int,input().split()))
dic={}
for i in range(m):
dic[ans[i]]=dic.get(ans[i],0)+1
def check(mid):
res=0
for k in dic.keys():
res=res+dic[k]//mid
if res>=n:
return True
else:
return False
l=0
r=m//n
while l<r:
mid=(l+r+1)//2
if check(mid):
l=mid
else:
r=mid-1
print(l)