描述: N位旅行者在夜里过桥需要借助手电筒。但N个人中只有一个手电筒,而且桥同时只能让两个人过。每个人单独过桥所需时间已知,但如果两个人同时过桥则所需时间是走得慢的那个人单独过桥所需的时间。设计一个方案,让这N个人尽快过桥,计算这N个人的最短过桥时间。
比如:有甲乙两丁四个人,他们过河所需的时间分别是1, 2, 5, 10。让最快的2个人先过桥,然后让跑的最快的人回去接剩下的人。先让甲乙过去(2分钟),甲回来(1分钟) ,甲丙过去(5分钟),甲回来(1分钟),甲丁再过去(10分钟),总共需要19分钟。
输入:第一行N(表示有N个人要过河),第二行是N个整数S,表示这N个人过河所需时间
输出:所有人过河的最短时间
样例输入: 4
12510
样例输出: 17
def f(n, s):
s.sort()
res = 0
for i in range(1, n):
if i == n - 1:
temp = max(s[0], s[i])
res = res + temp
else:
temp = max(s[0], s[i]) + s[0]
res = res + temp
return res
def f1(n, s):
s.sort()
res = s[0]
Next = [s[0], s[1]]
Cur = s
Cur.remove(Cur[0])
Cur.remove(Cur[0])
while (1):
if len(Next) == n:
break
else:
temp1 = max(Cur[len(Cur) - 1], Cur[len(Cur) - 2])
Cur.remove(temp1)
Next.append(temp1)
if len(Next) == n:
res = res + temp1
break
elif len(Cur)==1:
temp2 = min(Next)
res = res + temp1 + temp2
else:
temp2 = min(Next)
Next.remove(temp2)
Cur.append(temp2)
res = res + temp1 + temp2
return res
print(f1(4, [2, 5, 10, 1]))