1070 结绳 python

1070 结绳 (25 分)

给定一段一段的绳子,你需要把它们串成一条绳。每次串连的时候,是把两段绳子对折,再如下图所示套接在一起。这样得到的绳子又被当成是另一段绳子,可以再次对折去跟另一段绳子串连。每次串连后,原来两段绳子的长度就会减半。

rope.jpg

给定 N 段绳子的长度,你需要找出它们能串成的绳子的最大长度。

输入格式:

每个输入包含 1 个测试用例。每个测试用例第 1 行给出正整数 N (2≤N≤10​4​​);第 2 行给出 N 个正整数,即原始绳段的长度,数字间以空格分隔。所有整数都不超过10​4​​。

输出格式:

在一行中输出能够串成的绳子的最大长度。结果向下取整,即取为不超过最大长度的最近整数。

输入样例:

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()去找最小值,当然快很多啊啊啊啊啊 

猜你喜欢

转载自blog.csdn.net/weixin_43731183/article/details/86922334