当前位置: 首页 > news >正文

笔试-士兵过河

应用

一个军队有N名士兵需要过河,敌军在T时长后追上。现有一条小船,最多乘坐2名士兵。
当一名士兵划船过河时,用时为a[i],0<=i<N;
当两名士兵共同划船过河时,用时为max(a[i], a[j]),两士兵中单独划船较长的;
当两名士兵乘船、一名士兵划船过河时,用时为10*a[i],a[i]为单独划船的士兵;
士兵游泳过河直接标记为死亡。
#请设计一种方案,保证存活的士兵尽可能多、过河用时尽可能短。

实现

N = int(input("士兵数:"))
T = int(input("敌军到达时长:"))
strings = input("每个士兵过河时长:").split()
a = [int(i) for i in strings]

# 回
back_solution = []
for i in range(0, len(a)):
    g = [i, a[i]]
    back_solution.append(g)
# 去1
to_solution_1 = []
for i in range(0, len(a)-1):
    for j in range(i+1, len(a)):
        g = [i, j, max(a[i], a[j])]
        to_solution_1.append(g)
# 去2
to_solution_2 = []    
for i in range(0, len(a)):
    for j in range(0, len(a)):
        if i != j:
            # i为划船士兵
            g = [i, j, 10*a[i]]
            to_solution_2.append(g)

# print(f"回:{back_solution}")
# print(f"去一:{to_solution_1}")
# print(f"去二:{to_solution_2}")

# 为保证有效运输,采取“去2人回1人”,不能是“去1人回1人”、“去2人回2人”、“去2人回0人”。去+回=周期
cycles1 = []
for i in range(0, len(to_solution_1)):
    for j in range(0, len(back_solution)):

        driver0 = to_solution_1[i][0]
        driver1 = to_solution_1[i][1]
        back_member = back_solution[j][0]

        if back_member == driver0 or back_member == driver1:
            
            time = to_solution_1[i][-1] + back_solution[j][-1]
            g = [driver0, driver1, back_member, time]
            cycles1.append(g)

cycles2 = []
for i in range(0, len(to_solution_2)):
    for j in range(0, len(back_solution)):

        driver0 = to_solution_2[i][0]
        driver1 = to_solution_2[i][1]
        back_member = back_solution[j][0]

        if back_member == driver0 or back_member == driver1:
            
            time = to_solution_2[i][-1] + back_solution[j][-1]
            g = [driver0, driver1, back_member, time]
            cycles2.append(g)

# 从小到大排序
for i in range(0, len(cycles1)):
    for j in range(0, len(cycles1)):
        if cycles1[i][-1] < cycles1[j][-1]:
            cycles1[j], cycles1[i] = cycles1[i], cycles1[j]

for i in range(0, len(cycles2)):
    for j in range(0, len(cycles2)):
        if cycles2[i][-1] < cycles2[j][-1]:
            cycles2[j], cycles2[i] = cycles2[i], cycles2[j]

# print(f"组合一:{cycles1}")
# print(f"组合二:{cycles2}")

def compare(c1, c2):
    if c1[-1] <= c2[-1]:
        return c1
    else:
        return c2

i = 0
j = 0
safe = []
time = []
while T > 0:
    # 当前组合的乘船士兵,不包含已到达对岸的士兵
    if (cycles1[i][0] not in safe) and (cycles1[i][1] not in safe):
        if (cycles2[j][0] not in safe) and (cycles2[j][1] not in safe):
            # 最短时间方案
            c = compare(cycles1[i], cycles2[j])
            # 下一次循环的索引
            i = i + 1
            j = j + 1
        else:
            # 下一次循环的索引
            j = j + 1
            continue
    else:
        # 下一次循环的索引
        i = i + 1
        continue
    
    if c[0] == c[2]:
        safe.append(c[1])
    else:
        safe.append(c[0])
    
    time.append(c[-1])
    T = T - c[-1]

# print(f"临界值:{i-1}或{j-1}")
c = compare(cycles1[i-1], cycles2[j-1])
bak_index = c[2]
safe.append(bak_index)

sum = 0
for i in time:
    sum = sum + i
t = sum - a[bak_index]
print(len(safe), t)
士兵数:5
敌军到达时长:43
每个士兵过河时长:12 13 15 20 50
3 40

相关文章:

  • android 的抓包工具
  • Vue 入门到实战 十
  • 【算法】【位运算】acwing算法基础 801. 二进制中1的个数
  • 计算机毕业设计PySpark+Hadoop+Hive机票预测 飞机票航班数据分析可视化大屏 航班预测系统 机票爬虫 飞机票推荐系统 大数据毕业设计
  • 开启AI绘画的魔法大门!探索Stable Diffusion的无限魅力~
  • Python学习笔记 ver1.0
  • vue3 ref/reactive 修改数组的方法
  • 数据结构——红黑树的实现
  • Github Action自动流翻译README文档【CI/CD】
  • npm install 失败
  • 利用盲注技术获取表、列、具体数据
  • 英码科技基于昇腾算力实现DeepSeek离线部署
  • 日本股市概览:主要指数、经济泡沫与现代市场趋势(中英双语)
  • 深入理解C#结构型设计模式:类适配器与对象适配器
  • 公网IP、私网IP、动态IP、静态IP
  • ubuntu 实时系统安装Nvidia驱动
  • 网络安全 | 安全信息与事件管理(SIEM)系统的选型与实施
  • 08模拟法 + 技巧 + 数学 + 缓存(D1_模拟法)
  • 信息收集-Web应用JS架构URL提取数据匹配Fuzz接口WebPack分析自动化
  • 基于JavaWeb开发的Java+Spring+vue+element实现旅游信息管理平台系统
  • 中华人民共和国和巴西联邦共和国关于强化携手构建更公正世界和更可持续星球的中巴命运共同体,共同维护多边主义的联合声明
  • 教育部基础教育教指委:稳步推进中小学人工智能通识教育
  • 民企老板被错羁212天续:申请国赔千万余元,要求恢复名誉赔礼道歉
  • 竞彩湃|热刺、曼联一周双赛不易,勒沃库森能否欢送阿隆索
  • 深入贯彻中央八项规定精神学习教育中央指导组完成进驻
  • “科创板八条”后百单产业并购发布,披露交易金额超247亿