当前位置: 首页 > 面试经验 >

【 华为OD机试 2023】最短木板长度(Python)

优质
小牛编辑
161浏览
2023-03-28

【 华为OD机试 2023】最短木板长度(Python)

题目描述:

小明有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)

 类似资料: