笔试-士兵过河

应用

一支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
相关推荐
蒋星熠1 分钟前
实证分析:数据驱动决策的技术实践指南
大数据·python·数据挖掘·数据分析·需求分析
独行soc1 小时前
2025年渗透测试面试题总结-250(题目+回答)
网络·驱动开发·python·安全·web安全·渗透测试·安全狮
一晌小贪欢2 小时前
Pandas操作Excel使用手册大全:从基础到精通
开发语言·python·自动化·excel·pandas·办公自动化·python办公
IT痴者4 小时前
《PerfettoSQL 的通用查询模板》---Android-trace
android·开发语言·python
谅望者5 小时前
数据分析笔记14:Python文件操作
大数据·数据库·笔记·python·数据挖掘·数据分析
l1t5 小时前
调用python函数的不同方法效率对比测试
开发语言·数据库·python·sql·duckdb
2501_941111405 小时前
使用Scrapy框架构建分布式爬虫
jvm·数据库·python
今天吃饺子5 小时前
如何用MATLAB调用python实现深度学习?
开发语言·人工智能·python·深度学习·matlab
萧鼎5 小时前
Python Mahotas 图像处理库:高性能计算机视觉工具
图像处理·python·计算机视觉
破烂pan6 小时前
lmdeploy.pytorch 新模型支持代码修改
python·深度学习·llm·lmdeploy