应用
一支N个士兵的军队正在趁夜色逃亡,途中遇到一条湍急的大河。敌军在T的时长后到达河面,没到过对岸的士兵都会被消灭。现在军队只找到了1只小船,这船最多能同时坐上2个士兵。
1.当1个士兵划船过河,用时为 a[i]; 0<=i<N
2.当2个士兵坐船同时划船过河时,用时为 max(a[j],a[i])两士兵中用时最长的
3.当2个士兵坐船 1 个士兵划船时,用时为 a[i]*10; a[i]为划船士兵用时
4.如果士兵下河游泳,则会被湍急水流直接带走,算作死亡。
请帮忙给出一种解决方案,保证存活的士兵最多,且过河用时最短。
实现
python
N = int(input("士兵数量:"))
T = int(input("敌军到达时长:"))
strs = input("每个士兵过河时长:").split()
left = [int(i) for i in strs]
right = []
total = 0
result = [0, T]
def GO(left, right, total):
left.sort()
L = [x for x in left]
R = [x for x in right]
if len(left) == 0 or total > T:
# print(len(right), total)
# 实时更新存活人数、时长
if len(right) > result[0]:
result[0] = len(right)
result[1] = total
if len(right) == result[0]:
if total < result[1]:
result[1] = total
if len(left) == 1 and total <= T:
# 第一种方案
s = left[0]
t = total + s
if t <= T:
right.append(s)
left.remove(s)
BACK(left, right, t)
# 复原
left = [x for x in L]
right = [x for x in R]
else:
if len(right) > result[0]:
result[0] = len(right)
result[1] = total
if len(right) == result[0]:
if total < result[1]:
result[1] = total
if len(left) >= 2 and total <= T:
# 第二、三种方法
for i in range(0, len(left)):
for j in range(i+1, len(left)):
s1 = left[i]
s2 = left[j]
t = total + min(s2, s1 * 10)
if t <= T:
right.append(s1)
right.append(s2)
left.remove(s1)
left.remove(s2)
BACK(left, right, t)
left = [x for x in L]
right = [x for x in R]
else:
if len(right) > result[0]:
result[0] = len(right)
result[1] = total
if len(right) == result[0]:
if total < result[1]:
result[1] = total
def BACK(left, right, total):
right.sort()
L = [x for x in left]
R = [x for x in right]
if len(left) == 0 or total > T:
if len(right) > result[0]:
result[0] = len(right)
result[1] = total
if len(right) == result[0]:
if total < result[1]:
result[1] = total
if len(left) > 0 and total <= T:
# 第一种方案
s = right[0]
t = total + s
if t <= T:
left.append(s)
right.remove(s)
GO(left, right, t)
left = [x for x in L]
right = [x for x in R]
else:
if len(right) > result[0]:
result[0] = len(right)
result[1] = total
if len(right) == result[0]:
if total < result[1]:
result[1] = total
# 运行
GO(left, right, total)
# print(len(result))
print(result[0], result[1])
powershell
士兵数量:5
敌军到达时长:43
每个士兵过河时长:12 13 15 20 50
3 40
士兵数量:5
敌军到达时长:130
每个士兵过河时长:50 12 13 15 20
5 128
士兵数量:7
敌军到达时长:171
每个士兵过河时长:25 12 13 15 20 35 20
7 171