算法(蓝桥杯)贪心算法7——过河的最短时间问题解析

ops/2025/1/18 13:00:51/

一、题目描述

在漆黑的夜里,N位旅行者来到了一座狭窄且没有护栏的桥边。他们只带了一只手电筒,且桥窄得只够让两个人同时过。如果各自单独过桥,N人所需的时间已知;若两人同时过桥,则所需时间是走得较慢的那个人单独行动时所需的时间。任务是设计一个方案,让这N人尽快过桥,并计算出这N个人的最短过桥时间。

二、解答思路

要解决这个问题,关键在于合理安排过桥顺序,使总时间最短。以下是两种常见的策略:

(一)最快两人先过桥策略

  1. 步骤

    • 让速度最快的两个人先过桥。

    • 然后让速度最快的人回来,再带剩下的人过桥。

    • 重复上述过程,直到所有人都过桥。

  2. 示例

    • 假设有四个人甲乙丙丁,过河时间分别为甲:1,乙:2,丙:5,丁:10。

    • 先让甲乙过去(2分钟),甲回来(1分钟),甲丙过去(5分钟),甲回来(1分钟),甲丁再过去(10分钟),总共需要19分钟。

(二)最慢两人一起过桥策略

  1. 步骤

    • 先让速度最快的两个人过桥。

    • 然后让速度最快的人回来,接着让速度最慢的两个人一起过桥。

    • 速度第二快的人回来,再让速度最快的两个人过桥。

    • 重复上述过程,直到所有人都过桥。

  2. 示例

    • 同样是甲乙丙丁四个人,先让甲乙过去(2分钟),甲回来(1分钟),丙丁过去(10分钟),乙回来(2分钟),甲乙再过去(2分钟),总共需要17分钟。

三、代码分析

本题最优策略为策略二,对策略二进行分析,以下是针对该问题的Python代码实现及其分析:

Python复制

python">n=int(input())
a=[int(i) for i in input().split()]
a=sorted(a)
b=n//2
if n%2==0:sum =0for i in range(n):if i==0:sum=sum+(b-1)*a[i]elif i==1:sum=sum+(n-1)*a[i]elif i%2!=0:sum=sum+a[i]
else:sum=a[0]for i in range(n):if i==0:sum=sum+(b-1)*a[i]elif i==1:sum=sum+(n-2)*a[i]elif i%2==0:sum+=a[i]
if len(a)==1:print(a[0])
else:print(sum)

(一)代码逻辑

  1. 输入处理

    • 首先通过input()函数读取输入的整数N,表示过河的人数。

    • 然后读取N个整数,表示每个人过河所需的时间,并将这些时间存储在列表a中。

  2. 排序

    • 使用sorted(a)对列表a进行排序,这样可以方便后续根据速度安排过河顺序。

  3. 计算最短时间

    • 计算n//2的值,存储在变量b中,用于后续计算。

    • 通过if n%2==0判断人数N是否为偶数,从而选择不同的计算策略。

    • 在循环中,根据不同条件累加过河时间:

      • i==0时,表示速度最快的人,其过河次数与b-1有关。

      • i==1时,表示速度第二快的人,其过河次数与n-1n-2有关,具体取决于人数的奇偶性。

      • 对于其他情况,根据i%2的值判断是奇数还是偶数索引,分别累加对应的时间。

    • 最后,如果人数为1,直接输出该人的过河时间;否则输出计算得到的总时间sum

(二)代码优化建议

  1. 变量命名

    • 变量b的命名不够直观,建议改为更具描述性的名字,如half_n,表示人数的一半。

  2. 逻辑简化

    • 代码中存在重复的逻辑,如if i==0elif i==1的部分在两种情况下都有出现,可以考虑提取公共部分,减少代码冗余。

  3. 注释添加

    • 在关键代码段添加注释,解释每个步骤的作用和计算逻辑,便于他人理解和维护代码。

四、总结

过河的最短时间问题是一个典型的优化问题,通过合理安排过桥顺序,可以有效减少总时间。在解决此类问题时,需要仔细分析不同策略的优劣,并通过编程实现最优解。希望本文的解答和代码分析能帮助你更好地理解和解决这个问题。


http://www.ppmy.cn/ops/151092.html

相关文章

【Linux】常用指令详解二

前言 介绍一些Linux常用命令,本文为文章【Linux】常用指令详解一的续作 1.绝对路径与相对路径 绝对路径:从系统根目录开始,可以完整描述文件或目录的路径。使用绝对路径可以准确定位到系统中的某个文件或目录。 相对路径:相对…

Java Python:从简单案例理解 HTTP 服务开发与调用!

使用 Java 和 Python 实现 HTTP 服务创建和调用 在现代网络应用开发中,创建和调用 HTTP 服务是一项基本技能。本文将详细介绍如何使用 Java 和 Python 语言实现一个简单的 HTTP 服务,并展示如何使用相应语言的客户端代码对其进行调用和测试。我们将实现…

消息队列实战指南:三大MQ 与 Kafka 适用场景全解析

前言:在当今数字化时代,分布式系统和大数据处理变得愈发普遍,消息队列作为其中的关键组件,承担着系统解耦、异步通信、流量削峰等重要职责。ActiveMQ、RabbitMQ、RocketMQ 和 Kafka 作为市场上极具代表性的消息队列产品&#xff0…

芝麻http/品易http/太阳http/极光http退市后,还有哪家好用推荐?

相信,已经有不少程序员朋友在讨论芝麻HTTP、品易HTTP、太阳HTTP和极光HTTP退市的消息。说实话,芝麻系HTTP代理服务商在代理IP圈子里可以说是有举足轻重的位置,曾经也是吸引了不少用户的青睐。2个月前它们的退市可以说让代理IP整个市场无论是用…

Java 高级工程师面试高频题:JVM+Redis+ 并发 + 算法 + 框架

前言 在过 2 个月即将进入 3 月了,然而面对今年的大环境而言,跳槽成功的难度比往年高了很多,很明显的感受就是:对于今年的 java 开发朋友跳槽面试,无论一面还是二面,都开始考验一个 Java 程序员的技术功底…

BGP联盟

一、BGP联盟简介 1、什么是BGP联盟 BGP联盟(Confederation)是处理AS内部的IBGP网络连接激增的另一种方法,它将一个AS划分为若干个子自治系统(Sub AS),每个子AS内部建立IBGP全连接关系或者配置反射器&#…

AI编程工具使用技巧——通义灵码

活动介绍通义灵码1. 理解通义灵码的基本概念示例代码生成 2. 使用明确的描述示例代码生成 3. 巧妙使用注释示例代码生成 4. 注意迭代与反馈原始代码反馈后生成优化代码 5. 结合生成的代码进行调试示例测试代码 其他功能定期优化生成的代码合作与分享结合其他工具 总结 活动介绍…

k8s pod 中通过service account 访问API Server

创建Role,Rolebinding, Service account 和Pod 创建Role apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: namespace: myns name: myrole rules: - apiGroups: ["apps"] resources: ["deployments"] verbs: ["get", …