笔试-士兵过河

应用

一支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
相关推荐
敏编程20 小时前
一天一个Python库:jsonschema - JSON 数据验证利器
python
前端付豪20 小时前
LangChain记忆:通过Memory记住上次的对话细节
人工智能·python·langchain
databook20 小时前
ManimCE v0.20.1 发布:LaTeX 渲染修复与动画稳定性提升
python·动效
花酒锄作田1 天前
使用 pkgutil 实现动态插件系统
python
前端付豪2 天前
LangChain链 写一篇完美推文?用SequencialChain链接不同的组件
人工智能·python·langchain
曲幽2 天前
FastAPI实战:打造本地文生图接口,ollama+diffusers让AI绘画更听话
python·fastapi·web·cors·diffusers·lcm·ollama·dreamshaper8·txt2img
老赵全栈实战2 天前
Pydantic配置管理最佳实践(一)
python
阿尔的代码屋2 天前
[大模型实战 07] 基于 LlamaIndex ReAct 框架手搓全自动博客监控 Agent
人工智能·python
AI探索者3 天前
LangGraph StateGraph 实战:状态机聊天机器人构建指南
python
AI探索者3 天前
LangGraph 入门:构建带记忆功能的天气查询 Agent
python