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

server/2025/1/21 10:31:32/

一、题目描述

在漆黑的夜里,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/server/160153.html

相关文章

w-form-select 组件中 分析 自定义属性 和 el-select 自带属性 的对比表格

以下是该组件中 自定义属性 和 el-select 自带属性 的对比表格: 属性/功能自定义el-select 自带说明label✔️❌自定义属性,用于设置表单项的标签。prop✔️❌自定义属性,用于表单验证时的字段名。labelWidth✔️❌自定义属性,用…

Taro+Vue实现图片裁剪组件

cropper-image-taro-vue3 组件库 介绍 cropper-image-taro-vue3 是一个基于 Vue 3 和 Taro 开发的裁剪工具组件,支持图片裁剪、裁剪框拖动、缩放和输出裁剪后的图片。该组件适用于 Vue 3 和 Taro 环境,可以在网页、小程序等平台中使用。 源码 https:…

IDEA导入Maven工程不识别pom.xml

0 现象 把阿里 sentinel 项目下载本地后,IDEA 中却没显示 maven 工具栏。 1 右键Maven Projects 点击IDEA右侧边栏的Maven Projects,再点击: 在出现的选择框中选择指定的未被识别的pom.xml即可: 2 Add as maven project 右键p…

嵌入式硬件篇---PID控制

文章目录 前言第一部分:连续PID1.比例(Proportional,P)控制2.积分(Integral,I)控制3.微分(Derivative,D)控制4.PID的工作原理5..实质6.分析7.各种PID控制器P控…

vue3 el-table 根据id合并指定列单元格

参考文章:https://www.cnblogs.com/gggggggxin/p/14311726.html 在mounted方法中调用 onMergeLines() const onMergeLines () > {// 先给所有的数据都加一个v.rowspan 1tableData.value.forEach((item) > {item.rowspan 1})// 双层循环for (let i 0; i…

Vue3中ref和reactive的区别

在 Vue 3 中,ref 和 reactive 都是用于响应式编程的 API,但它们有不同的使用场景和行为。以下是它们之间的区别: 1. ref 用途:用于创建基本数据类型(如字符串、数字、布尔值)或对象的响应式引用。数据类型…

ios文件管理,沙盒机制以及如何操作“文件”APP,把文件共享到文件app

首先,系统是一个整体,那每个app是相互独立的,系统为每个app分配了一定的存储空间,也就是我们说的沙盒,每个app有自己独立的沙盒,文件存储在沙盒中,正常情况下app相互之间数据是不可以共享以及访…

2024:成长、创作与平衡的年度全景回顾

文章目录 1.前言2.突破自我:2024年个人成长与关键突破3.创作历程:从构想到落笔,2024年的文字旅程4.生活与学业的双重奏:如何平衡博客事业与个人生活5.每一步都是前行:2024年度的挑战与收获6.总结 1.前言 回首2024年&a…