笔试-士兵过河

应用

一支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
相关推荐
weixin_46681 天前
编程之python基础
开发语言·python
打酱油的;1 天前
【无标题】
爬虫·python·php
幸福清风1 天前
【Python】基于Tkinter库实现文件夹拖拽与选择功能
windows·python·microsoft·tkinter
海琴烟Sunshine1 天前
leetcode 168. Excel 表列名称 python
python·算法·leetcode
java1234_小锋1 天前
TensorFlow2 Python深度学习 - 卷积神经网络示例2-使用Fashion MNIST识别时装示例
python·深度学习·tensorflow·tensorflow2
@sinner1 天前
《扫雷:病毒蔓延》- 颠覆传统的动态扫雷游戏
python·游戏·pygame
愈努力俞幸运1 天前
python 列表浅拷贝 深拷贝
python
测试老哥1 天前
测试用例之正交试验法、功能图法
自动化测试·软件测试·python·功能测试·测试工具·职场和发展·测试用例
岁岁岁平安1 天前
python基本数据类型、字典、 集合、条件与循环控制、函数(3)
python·学习·集合·函数·字典·python3