1070 结绳 (25 分)
给定一段一段的绳子,你需要把它们串成一条绳。每次串连的时候,是把两段绳子对折,再如下图所示套接在一起。这样得到的绳子又被当成是另一段绳子,可以再次对折去跟另一段绳子串连。每次串连后,原来两段绳子的长度就会减半。
给定 N 段绳子的长度,你需要找出它们能串成的绳子的最大长度。
输入格式:
每个输入包含 1 个测试用例。每个测试用例第 1 行给出正整数 N (2≤N≤104);第 2 行给出 N 个正整数,即原始绳段的长度,数字间以空格分隔。所有整数都不超过104。
输出格式:
在一行中输出能够串成的绳子的最大长度。结果向下取整,即取为不超过最大长度的最近整数。
输入样例:
8
10 15 12 3 4 13 1 15
输出样例:
14
刚看完题的时候没看明白想干嘛,然后自己把输入样例这样算了一下:(1+3)/2=2,2/2+4/2=3,3/2+10/2=6.5....,算完以后得到一个比14大一点点的数,取整以后是14。然后就可以写代码了
N=int(input())
ls=list(map(int,input().split()))
x=0
while len(ls)>0:
if N>2:
a=min(ls)
x=x/2+a/2
ls.remove(a)
else: #这是测试点1,如果N=2的话,要这么算
a=min(ls)
x=x+a/2
ls.remove(a)
print(int(x))
只过了前两个点,后面的超时了:(
然后看了 PAT-python-zjw 大佬的代码,发现自己好蠢。
n=input()
m=list(map(int,input().split()))
m.sort()
a=m[0]/2+m[1]/2
for i in m[2:]:
a=a/2+i/2
print(int(a))
简单而且高效。用python的sort(),就不用每次都用min()去找最小值,当然快很多啊啊啊啊啊