题目描述:
小明有n块木板,第i(1<=i<=n)块木板的长度为ai。
小明买了一块长度为m的木料,这块木料可以切割成任意块,拼接到已有的木板上,用来加长木板。小明想让最短的木板尽量长。请问小明加长木板后,最短木板的长度最大可以为多少?
输入描述:
输入的第一行包含两个正整数,n(11n1103),m(11m1106)——n表示木板数,m表示木料长度。
输入的第二行包含n个正整数,a1,a2,,,,,an (1<=ai<=106)。
输出描述:
输出的唯一一行包含一个正整数,表示加长木板后,最短木板的长度最大可以为多少?
示例1
输入:
5 3
4 5 3 5 5
输出:
5
说明:
给第1块木板长度增加1,给第3块木板长度增加2后,这5块木板长度变为[5,5,5,5,5],最短的木板的长度最大为5。
示例2
输入:
5 2
4 5 3 5 5
输出:4
说明:
给第3块木板长度增加1后,这5块木板长度变为[4,5,4,5,5],剩余木料的长度为1。此时剩余木料无论给哪块木板加长,最短木料的长度都为4。
解题思路:
首先将木板列表按照长度升序排列,排在第一的就是最短的木板,然后依次遍历进行加长
例:遍历到第a块木板时,将前a-1块木板均补长至和a木块一样的长度。
此时会遇到两种情况:①木料够补齐;②木料不够补齐
情况①:继续下一轮循环,直到跳出循环,此时,所有木板中最短的那块一定是当前遍历到的第a块木板的长度(因为比它短的都补齐和它一样长了)
情况②:如果木料不够补齐,那么使用剩余的木料,均分给第1-(a-1)块木板,这样能保证前a-1块木板达到最长,长度为第a-1块木板的长度+均分给它的木料长度(注意:本题木板长度均为整型,所以“均分”时必须用整除//向下取整,这样才能符合要求)
---------------------------------------------------------------
跳出循环遍历后,我们还会遇到两种情况:(1)木料用完了(那么本题结束,直接输出就行)(2)木料没用完,此时需要将剩余木料全部均分给所有木块,逻辑同②
最后,注意,当只有一块木板时,需要对其“前一块木板”长度进行初始化,将其初始化为木板列表[0]即可
n,m=map(int,input().split())
st=sorted(list(map(int,input().split())))
l=len(st)
pre_len=st[0]
for i,value in enumerate(st):
if i*(value-pre_len)<=m:
m-=i*(value-pre_len)
pre_len=value
else:
pre_len=m//i+pre_len
if m >0:
pre_len=m//l+pre_len
print(pre_len)