星球争霸篮球赛

题目

在星球争霸篮球赛对抗赛中,强大的宇宙战队,希望每个人都能拿到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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值