首页 > 编程语言 >算法--旅行者过河问题

算法--旅行者过河问题

时间:2022-12-28 19:33:11浏览次数:59  
标签:过河 Scanner -- 过桥 旅行者 int 算法 t1

1.题目

在漆黑的夜里,四位旅行者来到了一座狭窄而且没有护栏的桥边。如果不借助手电筒的话,大家是无论如何也不敢过桥去的。不幸的是,四个人一共只带了一只手电筒,而桥窄得只够让两个人同时过。如果各自单独过桥的话,四人所需要的时间分别是1、2、5、8分钟;而如果两人同时过桥,所需要的时间就是走得比较慢的那个人单独行动时所需的时间。问题是,如何设计一个方案,让这四人尽快过桥。


2.算法

构造N个人(N≥1)过桥最佳方案的方法:

设A、B为走得最快和次快的旅行者,过桥所需时间分别为a、b;而Z、Y为走得最慢和次慢的旅行者,过桥所需时间分别为z、y。

1) 如果N=2,AB一起过桥。

t=b
2) 如果N=3,ABC三人,A+C过,A回;A+B过。

t=a+b+c
3) 如果N≥4,那么有两种过河模式,将ZY送到对岸,人数-2:

模式一:A+Z过,A回;A+Y过,A回

t1=2*a+y+z

模式二:A+B过,A回;Z+Y过,B回

t2=a+2*b+z

比较两种模式:

t1-t2=a+y-2b

当2b>a+y时,t1<t2,使用模式一;
否则,使用模式二。

这样下来每次人数-2,直到人数<4时结束递归,得到过河消耗的时间。


3.代码

import java.util.Arrays;
import java.util.Scanner;

/**
 * @author Administrator
 */
public class River {
    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        System.out.println("请输入过河人数:");
        int n=sc.nextInt();
        int[] a=new int[n];
        System.out.println("请输入过河人员情况:");
        for(int i=0;i<n;i++){
            a[i]=sc.nextInt();
        }
        Arrays.sort(a);
        System.out.println(getMinTime(a,n));
    }

    /**
     * 递归,n人过河时间=(n-2)人过河时间+送走时间最长的两个人消耗时间
     * @param a 过河人员情况
     * @param n 每次递归的人即为a的前n位(n每次递归-2,当n<4时,递归结束)
     * @return 返回每个阶段的时间,直到结束
     */
    public static int getMinTime(int[] a,int n){
        if(n==3){
            return a[0]+a[1]+a[2];
        }
        else if(n==2){
            return a[1];
        }
        //判断两个模式应该选择哪一种
        int t1=2*a[0]+a[n-2]+a[n-1];
        int t2=a[0]+2*a[1]+a[n-1];
        int t;
        if((a[0]+a[n-2])<(2*a[1])){
            t=t1;
        }
        else{
            t=t2;
        }
        return getMinTime(a,n-2)+t;
    }
}


4.结果

image

标签:过河,Scanner,--,过桥,旅行者,int,算法,t1
From: https://www.cnblogs.com/Studywith/p/17011088.html

相关文章

  • 【通俗易懂】机器学习中 L1 和 L2 正则化的直观解释
    微信公众号:AI有道(ID:redstonewill)机器学习中,如果参数过多,模型过于复杂,容易造成过拟合(overfit)。即模型在训练样本数据上表现的很好,但在实际测试样本上表现的较差,不具备良好的......
  • 思科配置
    路由交换设置与维护方法​IP地址​1、IP地址分类​A类:0.0.0.0——126.255.255.255局域网私有可用地址10.0.0.0——10.255.255.255,子网掩码255.0.0.0(8)​B类:128.0.0.0.——19......
  • C语言---循环结构
    一、goto语句 1、求100以内3的倍数之和#include<stdio.h>//求100以内3的倍数之和//sum=3+6+9...+99;intmain(){intsum=0;inti=3;loop:sum=sum+i;......
  • Python__16--集合
    1集合一句话,没有value的字典,无序可变序列。1.1集合的创建1.1.1使用{}s={2,3,4,5,5,6,7,7}#输出为{2,3,4,5,6,7}集合中元素不允许重复1.1.2使用set()测试代码:......
  • jQuery选择器
    什么是jQuery选择器?能够选择使用网页上的元素,跟css选择器类似jQuery选择器的优势1.相比于JavaScript节点获取元素,更容易控制元素2.内部添加了特有的选择器。如......
  • 【221228-2】三角形ABC中,角A=45度,AD垂直BC于D,BD=3,DC=2. 求AB长度?(使用三角函数或相似三
    ......
  • 云渲染时可以关机吗_云渲染电脑可以关闭吗?
    云渲染可简单理解为放在云端的渲染农场,可区别于用户本地自己搭建的小型私有农场,用户只需将自己制作好的项目文件进行打包,通过​云渲染​平台提供的客户端或网页端将文件上传......
  • 日记-221228
    日记-221228地点:嘉兴状态:良好Todo:做饭每日一题小记第一次做饭开心,第一次写日记,今天和咱姐讲了讲zzy的事,我也不知道最后结局这么样,但绝对要努力,去改变,去奋斗。能......
  • BigDecimal类
    思考代码输出结果publicclassTestBigDecimal{publicstaticvoidmain(String[]args){doubled1=1.0;doubled2=0.9;System.ou......
  • automapper、autofack、子组件(props)、base64、请求头以及JWT和Session和Cookie 的区
    1、automapper将一个对象的字段的值映射到另一个对象相应的字段中使用:1.引用NuGet:AutoMappert、AutoMapper.Extensions.Microsoft.DependencyInjection2.新建一个......