题目
在星球争霸篮球赛对抗赛中,强大的宇宙战队,希望每个人都能拿到MVP。
MVP的条件是,单场最高分得分获得者,可以并列,所以宇宙战队决定在比赛中,尽可能让更多的队员上场,且让所有有得分的队员得分都相同。
然而比赛过程中的每一分钟的得分都只能由某一个人包揽。
输入描述: 输入第一行为一个数字t,表示有得分的分钟数( 1 <= t <= 50),第二行为t个数字,代表每一分钟的得分p(1 <= p <= 50)
输出描述: 输出有得分的队员都是MVP时最少的MVP得分。
补充说明:
示例
示例1
输入: 9
5 2 1 5 2 1 5 2 1
输出: 6
说明: 样例解释:一共4人得分,分别都为6分
5 + 1
5 + 1
5 + 1
2 + 2 + 2
题意
尽可能多地把这一堆数字分成多组和相等的数字,求这个数字的大小
Python代码
scores=[5,2,1,5,2,1,5,2,1]
思路:使用x个桶(1<=x<=sum(scores)//max(scores)),每个桶的容量为sum(scores) / x(sum(scores)/x必须为整数),然后遍历scores,尝试把所有桶装满,如果不能, 桶的数量减1,即使用x-1个桶;继续以上步骤
核心思想:在遍历的过程中,贪心地把score放进桶里,即:如果当前的score大
于当前桶的大小,那么跳过这个桶,直到找到能够装下score的桶
max_score = max(scores)
sum_scores = sum(scores)
# 桶的个数不会超过 sum_scores // max_score
max_budget_num = sum_scores // max_score
for i in range(max_budget_num, 0, -1):
# i为桶的数量
if sum_scores % i != 0:
continue
cur_budget_size = sum_scores // i # 当前每个桶大小
budget_list = [cur_budget_size] * i
for score in scores:
j = 0
while j < i:
if budget_list[j] >= score:
budget_list[j] -= score
break
else:
j += 1
if not all(budget_list):
return cur_budget_size
return -1