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

一、题目描述

在漆黑的夜里,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复制

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.rhkb.cn/news/3476.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LDD3学习7--硬件接口I/O端口(以short为例)

1 理论 1.1 基本概念 目前对外设的操作,都是通过寄存器。寄存器的概念,其实就是接口,访问硬件接口,有I/O端口通信和内存映射I/O (Memory-Mapped I/O),I/O端口通信是比较老的那种,都是老的串口并口设备&am…

前端【3】--CSS布局,CSS实现横向布局,盒子模型

盒子分类 1、块级盒子 2、内联级盒子 3、内联块级盒子 4、弹性盒子 5、盒子内部分区 方法一:使用 float 普通盒子实现横向布局 方法二:使用 display: inline-block 内联块级元素实现横向布局 方法三:使用弹性盒子 flexbox&#xff0…

初学stm32 --- flash模仿eeprom

目录 STM32内部FLASH简介 内部FLASH构成(F1) FLASH读写过程(F1) 闪存的读取 闪存的写入 内部FLASH构成(F4 / F7 / H7) FLASH读写过程(F4 / F7 / H7) 闪存的读取 闪存的写入 …

LLM - 大模型 ScallingLaws 的 CLM 和 MLM 中不同系数(PLM) 教程(2)

欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://spike.blog.csdn.net/article/details/145188660 免责声明:本文来源于个人知识与公开资料,仅用于学术交流,欢迎讨论,不支持转载。 Scalin…

【数据库】MySQL数据库SQL语句汇总

目录 1.SQL 通用语法 2.SQL 分类 2.1.DDL 2.2.DML 2.3.DQL 2.4.DCL 3.DDL 3.1.数据库操作 3.1.1.查询 3.1.2.创建 3.1.3.删除 3.1.4.使用 3.2.表操作 3.2.1.查询 3.2.2.创建 3.2.3.数据类型 3.2.3.1.数值类型 3.2.3.2.字符串类型 3.2.3.3.日期时间类型 3.2…

JavaEE之CAS

上文我们认识了许许多多的锁,此篇我们的CAS就是从上文的锁策略开展的新概念,我们来一探究竟吧 1. 什么是CAS? CAS: 全称Compare and swap,字⾯意思:“比较并交换”,⼀个CAS涉及到以下操作: 我们假设内存中…

【Go】Go数据类型详解—指针

1. 前言 在我看来,一门编程语言语法的核心就在于数据类型。而各类编程语言的基本数据类型大致相同:int整型、float浮点型、string字符串类型、bool布尔类型,但是在一些进阶数据类型上就有所不同了。本文将会介绍Go语言当中核心的数据类型——…

前端性能-HTTP缓存

前言 开启 HTTP 缓存是提升前端性能的常见手段之一。通过缓存,浏览器可以临时存储资源,在后续请求中直接使用本地副本,从而有效减少 HTTP 请求次数,显著缩短网页加载时间。以下是 HTTP 缓存的几个关键点: 1、减少重复…

2024CVPR《HomoFormer》

这篇论文提出了一种名为HomoFormer的新型Transformer模型,用于图像阴影去除。论文的主要贡献和创新点如下: 1. 研究背景与动机 阴影去除的挑战:阴影在自然场景图像中普遍存在,影响图像质量并限制后续计算机视觉任务的性能。阴影的空间分布不均匀且模式多样,导致传统的卷积…

arcgis提取不规则栅格数据的矢量边界

效果 1、准备数据 栅格数据:dem或者dsm 2、栅格重分类 分成两类即可 3、新建线面图层 在目录下选择预先准备好的文件夹,点击右键,选择“新建”→“Shapefile”,新建一个Shapefile文件。 在弹出的“新建Shapefile”对话框内“名称”命名为“折线”,“要素类型”选…

函数(函数的概念、库函数、自定义函数、形参和实参、return语句、数组做函数参数、嵌套调用和链式访问、函数的声明和定义、static和extern)

一、函数的概念 •C语⾔中的函数:⼀个完成某项特定的任务的⼀⼩段代码 •函数又被翻译为子函数(更准确) •在C语⾔中我们⼀般会⻅到两类函数:库函数 ⾃定义函数 二、库函数 1 .标准库和头文件 •C语⾔的国际标准ANSIC规定了⼀…

Docker私有仓库管理工具Registry

Docker私有仓库管理工具Registry 1 介绍 Registry是私有Docker仓库管理工具,Registry没有可视化管理页面和完备的管理策略。可借助Harbor、docker-registry-browser完成可视化和管理。Harbor是由VMware开发的企业级Docker registry服务。docker-registry-browser是…

Adobe与MIT推出自回归实时视频生成技术CausVid。AI可以边生成视频边实时播放!

传统的双向扩散模型(顶部)可提供高质量的输出,但存在显著的延迟,需要 219 秒才能生成 128 帧的视频。用户必须等待整个序列完成才能查看任何结果。相比之下CausVid将双向扩散模型提炼为几步自回归生成器(底部&#xff…

MySQL(高级特性篇) 06 章——索引的数据结构

一、为什么使用索引 索引是存储引擎用于快速找到数据记录的一种数据结构,就好比一本教科书的目录部分,通过目录找到对应文章的页码,便可快速定位到需要的文章。MySQL中也是一样的道理,进行数据查找时,首先查看查询条件…

turtle教学课程课堂学习考试在线网站

完整源码项目包获取→点击文章末尾名片!

python中的RPA->playwright自动化录制脚本实战案例笔记

playwright录制功能使用绕过登录操作 1、首先安装playwright pip install playwright2、 安装支持的浏览器 playwright install # 安装支持的浏览器:cr, chromium, ff, firefox, wk 和 webkit3、接着在自己的项目下运行录制命令: playwright codegen…

电脑风扇声音大怎么办? 原因及解决方法

电脑风扇是电脑的重要组件之一,它的作用是为电脑的各个部件提供冷却,防止电脑过热。然而,有时候我们会发现电脑风扇的声音特别大,不仅影响我们的使用体验,也可能是电脑出现了一些问题。那么,电脑风扇声音大…

python如何解析word文件格式(.docx)

python如何解析word文件格式(.docx) .docx文件遵从开源的“Office Open XML标准”,这意味着我们能用python的文本操作对它进行操作(实际上PPT和Excel也是)。而且这并不是重复造轮子,因为市面上操作.docx的…

PHP智慧小区物业管理小程序

🌟智慧小区物业管理小程序:重塑社区生活,开启便捷高效新篇章 🌟 智慧小区物业管理小程序是一款基于PHPUniApp精心雕琢的智慧小区物业管理小程序,它犹如一股清新的科技之风,吹进了现代智慧小区的每一个角落…

26个开源Agent开发框架调研总结(一)

根据Markets & Markets的预测,到2030年,AI Agent的市场规模将从2024年的50亿美元激增至470亿美元,年均复合增长率为44.8%。 Gartner预计到2028年,至少15%的日常工作决策将由AI Agent自主完成,AI Agent在企业应用中…