题目链接:
「EZEC-10」打分
import sys
def max_score(n, m, scores):
scores.remove(min(scores)) # 最小值的选取,不影响中间部分的处理
scores.sort()
max_ = scores[-1]
sum_ = sum(scores[:-1]) # 中间部分
len_ = len(scores)
needed = (len_ - 1) * max_ - sum_ # 中间部分对齐最大值的操作数
if needed >= m: # 所给的操作次数 无法完全填满 ; 全部往中间部分凑
return sum_ + m
else: # 可操作次数大于needed,即中间部分对齐最大值后,仍有剩余
m -= needed
turns , extra = divmod(m,len_) # m // len_ && m%len_ 均分是否有剩余
if extra == 0: # 整除
return max_ * len_ + turns * len_ - max_ - turns # 最大值:max_ + turns
else: # 有余数
return max_ * len_ + turns * len_ + extra -max_ - turns - 1 # 最大值:max_ + turns + 1 ,最大值比原来的最大值 max + turns 还大1
n, m = map(int, sys.stdin.readline().split())
scores = list(map(int, sys.stdin.readline().split()))
print(max_score(n, m, scores))
注意正确处理”最大值的更新“部分,其实也可以用mod运算圈定增长的范围,我这一步之前没有做好,就换方法了.... 有ac的好方法,欢迎指正