【现代谜题】晚上有四个人要过桥,只有一个手电筒,每次过桥都需要手电筒,每次最多可同时过两个人,其中甲过桥要1分钟,乙要2分钟,丙要5分钟,丁要10分钟。求最短的过桥时间。

2023-11-06


题目

晚上有四个人要过桥,只有一个手电筒,每次过桥都需要手电筒,每次最多可同时过两个人,其中甲过桥要1分钟,乙要2分钟,丙要5分钟,丁要10分钟。求最短的过桥时间。


一、思路

首先从四个人开始分析。
很明显从桥的一边到另一边的时间主要由慢的人确定,但是每次都需要来回运送手电,要想时间更少那么送手电的人速度就必须要快,很明显要么最快的带次慢和最慢的人过去,要么最快和次快的先过去然后让两个慢的一起过去。

甲–A
乙–B
丙–C
丁–D

方法一:

AD过桥----A返回
AC过桥----A返回
AB过桥--------一共用时 10+1+5+1+2=19min

方法二:

AB过桥----A返回
CD过桥----B返回
AB过桥-------一共用时 2+1+10+2+2=17min

甲乙过桥----甲返回
丙丁过桥----乙返回
甲乙过桥-------一共用时2+1+10+2+2=17min
当前发现这个方式是最快的。
并且这两种方式过桥的最后一趟一定是由次快的人的速度决定

所以这两种方式时间可以写成一个通式:

方法一:time=D+A+C+A(+B)=2A+C+D(+B)
方法二:time=B+A+D+B(+B)=2
B+A+D(+B)

2A+C+D=2B+A+D---->A+C=2B
把两种方法所用时间进行比较就能得出那种更快了。
所以当A+C>2
B的时候方法二要快,反之。

n<4的情况就不用说了。
如果人数为n的话(n>=4)
只需要简单的使用一下递归,每次送两个人过桥就好了。

二、代码

代码如下:

public class text2 {
   public static void quick_sort(int arr[], int l, int r){
      /*
      * 快速排序*/
      if(l>=r) return;

      int q=arr[(l+r)>>1],i=l-1,j=r+1;//分界点和边界

      while(i<j){
         do i++; while (q>arr[i]);
         do j--; while (q<arr[j]);
         if(i<j){
            int t=arr[i];
            arr[i]=arr[j];
            arr[j]=t;
         }
      }
      quick_sort(arr, l, j);
      quick_sort(arr, j+1, r);

      /*for (int i :
              arr) {
         System.out.println(i);
      }*/

   }

   public static void main (String [] args){

      int n=new Scanner(System.in).nextInt();//人数
      int arr[]=new int[n];//每人过桥时间

      for(int i=0;i<n;i++){
         arr[i]=new Scanner(System.in).nextInt();
      }
      quick_sort(arr,0,n-1);

      System.out.print(short_time(arr,n));
   }
   public static int short_time(int arr[],int n){//传入每人过桥时间和人数
   
      int number=n,time=0;

      if (n<4)
      switch (n){
         case 1: return arr[0];
         case 2: return arr[1];
         case 3: return arr[0]+arr[1]+arr[2];
      }

      else {
         int a=arr[0],b=arr[1],c=arr[n-2],d=arr[n-1];
         //  最快     次快     次慢      最慢
         //2*b+a+d   ||  2*a+c+d
         if((2*b+a+d)<(2*a+c+d)){
            time=2*b+a+d;
         }else {
            time=2*a+c+d;
         }
         number-=2;
      }

      time+=short_time(arr,number);
      return time;
   }
}

测试数据

在这里插入图片描述

4
1
2
5
10
17
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【现代谜题】晚上有四个人要过桥,只有一个手电筒,每次过桥都需要手电筒,每次最多可同时过两个人,其中甲过桥要1分钟,乙要2分钟,丙要5分钟,丁要10分钟。求最短的过桥时间。 的相关文章

随机推荐

  • TypeError: Failed to convert object of type <class ‘list‘> to Tensor.

    TypeError Failed to convert object of type
  • BLE芯片PHY6222的ANCS代码解读

    BLE芯片PHY6222的ANCS代码解读 ANCS是什么 实现原理 PHY6222软件实现框架 要获取的详细信息 开通知源 通知源的解析 数据源的解析 ANCS是什么 ANCS 苹果通知中心 Apple Notification Cent
  • 对聚合函数(sum,count,min,max,avg)和having的作用和理解

    having诞生 mysql中 当我们用到聚合函数 如sum count后 又需要筛选条件时 having就派上用场了 因为WHERE是在聚合前筛选记录的 having和group by是组合着用的 下面通过实例介绍下用法 例如 selec
  • PS怎么把图片处理的更清晰

    视频没有 把步骤都写了出来 看下对你有帮助不 方法一 1 复制图层 2 去色 3 滤镜 其它 高反差保留 4 叠加 比较简单 但是效果没方法二的好 方法二 1 打开一张模糊的照片 2 选择通道 红色通道 3 复制红色通道 4 执行滤镜 风格
  • python如何实现GRPC服务,python实现简单的grpc通信

    引流个人主页 尚拙谨言的博客 CSDN博客 技术实战 学习经验分享 大道至简系列领域博主 grpc是一种基于某种协议实现不同机器间进行通信的服务框架 不同机器可以是不同的服务端 客户端 当服务端实现好某些功能后 提供一个服务接口 供不同客户
  • 用qDebug输出

    1 像printf 那样输出 a A 读入一个浮点值 仅C99有效 c 读入一个字符 d 读入十进制整数 i 读入十进制 八进制 十六进制整数 o 读入八进制整数 x X 读入十六进制整数 s 读入一个字符串 遇空格 制表符或换行符结束 f
  • 每日一道面试题之什么是C/S架构?什么是B/S架构?

    C S架构 Client Server架构 是一种分布式计算架构 其中客户端应用程序与服务器应用程序之间通过网络进行通信 在C S架构中 客户端负责用户界面和交互 而服务器负责处理业务逻辑和数据存储 例如 我们经常使用的数据库管理系统 如M
  • linux脚本解释,shell 脚本中的注释详解

    上次写了shell脚本的注释 没想到那么多人的需要 也存在不少不足 这次做个补充吧 单行注释 单行注释就比较简单了 直接在行最前端加上符号 即可 具体用法如下所示 this is comment test echo this is comm
  • Sass运算

    1 加法 加法运算是 Sass 中运算中的一种 在变量或属性中都可以做加法运算 如 box width 20px 8in 编译出来的 CSS box width 788px 但对于携带不同类型的单位时 在 Sass 中计算会报错 如下例所示
  • module 'tensorflow' has no attribute 'random_normal'

    报错 module tensorflow has no attribute random normal 说明tensorflow中没有random normal这个方法 最新一版的random normal方法已经换为 random nor
  • Python编程语言概述

    Python编程语言概述 Python是一种高级编程语言 以其简洁 易读和可扩展性而闻名 它具有广泛的应用领域 包括Web开发 科学计算 人工智能和数据分析等 本文将介绍Python的基本特性 语法结构和一些常用的编程范例 Python的基
  • makefile后缀规则

    linux下采用c 编写程序后编译成可执行文件时 敲打的命令太多 尤其是对于同时编译很多文件时尤其不便 采用后缀规则可以节省很多功夫 下面是一个简略的makefile文件 只需敲入make 源码文件名 out即可完成编译 继续学习中 CPP
  • 冒泡排序_C++

    include
  • Hadoop之CDH安装

    1 离线数据存储及查询环境部署 离线数据的存储与查询主要是以hadoop为中心的技术栈 包括hive hbase hue kylin等 部署hadoop的方式比较流行的主要有三种 1 直接部署Apache Hadoop 即手工部署 需要自己
  • 常见的阵列技术——raid0,1,5

    常见的阵列技术 Raid0 没有容错设计的条带磁盘阵列 数据条带 并行读写 最大数据容量 成本低 速度快 一块的磁盘坏了 数据全部丢失 没有冗余 低可靠性 Raid1 相互镜像 冗余最大 快速恢复 成本高 高可靠性 最多允许一半的磁盘坏 数
  • DB扩展名的数据库文件怎么打开:两种db数据库的打开方式

    两种db数据库的打开方式 现在桌面级的各种管理系统使用的数据库都是比较常见的类型 比如Access数据库 扩展名为mdb xBase类数据库 扩展名为dbf 但有两种扩展名同为db的数据库 分属两个公司的产品 一个是老牌桌面数据库Parad
  • ssd recommended_怎么看SSD还能用多久 固态硬盘寿命检测方法【详解】

    关于固态硬盘和机械硬盘的对比 理论上来说呢 固态硬盘的寿命是不如机械硬盘的 不过实际运用情况下 SSD由于抗震能力强 实际用起来寿命可能比机械硬盘还长 毕竟很多机械硬盘都是高速旋转过程中 受到碰撞导致磁头破坏 硬盘也就坏了 下面分享几种固态
  • [CISCN2021 Quals]upload

    知识点 unicode字符替代 二次渲染绕过 目录结构识别 upload php 中限制了图片的大小 长宽 以及一些字母
  • 机器学习基础(一):平均数中位数众数

    机器学习基础 一 平均数中位数众数 从一组数字中我们可以学到什么 在机器学习 和数学 中 通常存在三中我们感兴趣的值 均值 Mean 平均值 中值 Median 中点值 又称中位数 众数 Mode 最常见的值 例如 我们已经登记了 13 辆
  • 【现代谜题】晚上有四个人要过桥,只有一个手电筒,每次过桥都需要手电筒,每次最多可同时过两个人,其中甲过桥要1分钟,乙要2分钟,丙要5分钟,丁要10分钟。求最短的过桥时间。

    文章目录 题目 一 思路 方法一 方法二 二 代码 测试数据 题目 晚上有四个人要过桥 只有一个手电筒 每次过桥都需要手电筒 每次最多可同时过两个人 其中甲过桥要1分钟 乙要2分钟 丙要5分钟 丁要10分钟 求最短的过桥时间 一 思路 首先