方案 A(最快人送手电筒):(a + b) + a + (a + c) + a + (a + d) = 4a + b + c + d。
方案 B(两个慢的一起):(a + b) + a + (c + d) + b + (a + b) = 2a + 3b + c + d(这里 a + b 是首尾,重新推导:(a+b) + a + (c+d) + b + (a+b) 不对,应该是 (a+b) + a + (c+d) + b + (a+b) 即 3b + 2a + c + d)。
def bridge_time(times): """times: 每人过桥时间,升序""" times.sort() total = 0 while len(times) > 3: a, b = times[0], times[1] c, d = times[-2], times[-1] # 两种方案选优 total += min(2*b + a + d, # a 和 d 过,a 回,b 和 c 过,b 回 2*a + c + d) # a 和 d 过,a 回,a 和 c 过,a 回(错,应是 a+d 过 + a 回 + a+c 过 + a 回 = 2a + c + d) times = times[:-2] if len(times) == 3: total += sum(times) elif len(times) == 2: total += max(times) else: total += times[0] return total