【问题描述】

n个人要晚上过桥,在任何时候最多两个人一组过桥,每组要有一只手电筒。在这n个人中只有一个手电筒能用,因此要安排以某种往返的方式来返还手电筒,使更多的人可以过桥。

  注意:每个人的过桥速度不同,每组的速度由过桥最慢的人所用的时间决定,约定n<=1000,并且没有人的过桥时间会超过100秒。

【输入】

  1. 输入的第一行给出n,
  2. 接下来的n行给出每个人的过桥时间,不会超过1000人,且没有人的过桥时间会超过100秒。 4 1 2 5 10

【输出】

 输出的第一行给出所有n个人过桥的总的秒数,接下来的若干行给出实现策略。每行包括一个或两个整数,表示组成一组过桥的一个或两个人,以所用的时间标识。
总共:17 秒
去:1 2
回:1
去:5 10
回:2
去:1 2

【分析】由于一次过桥最多两人且手电筒需要往返传递,因此以两个成员过桥为一个分析单位,计算过桥时间。以按过桥时间递增的顺序将n个成员排序。则a[1]是最快的人,a[2]次之,a[n]是最慢的人,a[n-1]是倒数第二慢的人。在相对状况下考虑,则有两种方案:

  1. 用最快的成员a[1]传递手电筒帮助最慢的a[n]和a[n-1]过桥,易知来回所用的时间为2*a[1]+a[n]+a[n-1]
  2. 用最快的成员a[1]和次快的成员a[2]传递手电筒帮助最慢的a[n]和a[n-1]过桥,具体方案如下:

              1.a[1]和a[2]到对岸,所用时间为a[2];

              2.a[1]返回,将手电筒给最慢的a[n]和a[n-1],并且a[n]和a[n-1]到对岸后将手电筒交给a[2],所用时间为:a[1]+a[n];

              3.a[2]返回,所用时间为a[2];

              综合起来方案二所用的总时间为2*a[2]+a[n]+a[1]。

显然,两种方案的好坏取决于他们的总时间,若2a[1]+a[n]+a[n-1]<2a[2]+a[n]+a[1],即采用第一种方案,否则采用第二种方案。我们每次帮助最慢的两个人过桥,累加时间,最后可能出现的两种情况:

            1.对岸剩下两个队员,全部过桥,时间为a[2];

            2.对岸剩下三个队员,用最快的成员传递手电筒,帮助最慢的成员过桥,然后与次慢的成员一起过桥,时间为:a[1]+a[n-1]+a[n],注意,这里的n=3。

参考博主:解决N个人过桥时间最短问题(Java版本)

package com.wxw.online;

import java.util.Scanner;

/**
* @Author: wxw
* @create: 2019-10-17-10:41
*/ public class GreedBridge {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n, i, k;//人数为n,i,j,k为循环控制变量,数组存储过桥时间
int[] a = new int[1024];
int sum = 0; //过桥总时间
n = sc.nextInt();
for (i = 1; i <= n; i++)
a[i] = sc.nextInt();
if (n == 1) {
System.out.format(a[1] + "%n" + a[1]);
}
k = n;
while (k > 3) //求总时间
{
//分情况讨论
if (a[1] + a[k - 1] < 2 * a[2])
sum += a[k] + a[1] * 2 + a[k - 1];
else
sum += a[2] * 2 + a[1] + a[k];
k -= 2;
}
if (k == 2) //对岸剩下两个成员
sum += a[2];
else //对岸剩下3个成员
sum += a[1] + a[2] + a[3];
System.out.println(sum);//输出n个人的过桥时间
k = n;
while (k > 3) //输出具体方案
{
if (a[1] + a[k - 1] < 2 * a[2]) //输出用a[1]传递手电筒方案
{
System.out.format(a[1] + " " + a[k] + "%n" + a[1] + "%n" + a[1] + " " + a[k - 1] + "%n" + a[1]);
} else //输出用a[1]、a[2]传递手电筒发的方案
{
System.out.format(a[1] + " " + a[2] + "%n" + a[1] + "%n" + a[k] + " " + a[k - 1] + "%n" + a[2] + "%n");
k -= 2;
}
if (k == 2)
System.out.println(a[1] + " " + a[2]);
else { System.out.format(a[1] + " " + a[3] + "%n" + a[1] + "%n" + a[1] + " " + a[2]);
} }
}
}

解决N个人过桥时间最短问题(Java版本)的更多相关文章

  1. 你的程序支持复杂的时间调度嘛?如约而来的 java 版本

    你的程序支持复杂的时间调度嘛? 这篇文章介绍了时间适配器的c#版本,是给客户端用的,服务器自然也要有一套对应的做法,java版本的 [年][月][日][星期][时间] [*][*][*][*][*] ...

  2. c# DateTime时间格式和JAVA时间戳格式相互转换

    /// java时间戳格式时间戳转为C#格式时间 public static DateTime GetTime(long timeStamp) { DateTime dtStart = TimeZon ...

  3. 解决weblogic与系统时间相差8小时的问题

    解决weblogic与系统时间相差8小时的问题 在一般情况下weblogic与系统时间是很少会出现时间差的问题,但有可能在某一特定的情况下就会出现,如使用weblogic8版本时可能会出现时差问题: ...

  4. appium---【已解决】【Mac】如何查看java的安装路径及JAVA_HOME环境变量的配置

    报错截图:根据提示可以看出,JAVA_HOME的环境变量配置错误,需要重新配置. 1.查看Java版本 打开mac电脑,查看java版本,打开终端Terminal,通过命令查看java的版本 Luck ...

  5. 解决Dynamic Web Module 3.1 requires Java 1.7 or newer

    需要检查和确认Eclipse项目属性的java版本和本地jdk的版本一致,以1.7版本为例: 1. 在 Java Build Path的libraries中修改对应的JDK版本为1.7: 2.在Jav ...

  6. Redis实现分布式锁的正确使用方式(java版本)

    Redis实现分布式锁的正确使用方式(java版本) 本文使用第三方开源组件Jedis实现Redis客户端,且只考虑Redis服务端单机部署的场景. 分布式锁一般有三种实现方式: 1. 数据库乐观锁: ...

  7. 31天重构学习笔记(java版本)

    准备下周分享会的内容,无意间看到.net版本的重构31天,花了两个小时看了下,可以看成是Martin Fowler<重构>的精简版 原文地址:http://www.lostechies.c ...

  8. selenium 使用教程详解-java版本

    第一章 Selenium 概述 1.1.Selenium 发展史 ​ Selenium是一系列基于Web的自动化工具,提供一套测试函数,用于支持Web自动化测试.函数非常灵活,能够完成界面元素定位.窗 ...

  9. Mac下修改默认的Java版本

    今天在安装Elicpse IDE的时候,发现提示安装的Java版本不支持,于是在官方去下载了Jre最新版本并安装,在安装完过后再次打开Elicpse发现提示还是不正确,如果用Google查询到一些资料 ...

随机推荐

  1. myeclipse 9.0 破解方法,亲测可用

    MyEclipse 9.0的破解方法,步骤如下: 1.破解公钥,确保MyEclipse没有开启,否则失败! 用WinRAR打开Common\plugins\com.genuitec.eclipse.c ...

  2. golang数据结构之散哈希表(Hash)

    hash.go package hash import ( "fmt" ) type Emp struct { ID int Name string Next *Emp } //第 ...

  3. Filter 原理

    二.Filter 原理 2.1 Filter 概述 Filter(过滤器)是 DirectShow 中最基本的概念.DirectShow 是通过 Filter Graph 来管理 Filter 的.F ...

  4. javascript检索某个字符或字符串在源字符串中的位置(下标)

    indexOf()方法 JavaScript中的String对象提供了一个indexOf(searchValue, fromIndex)方法用于检索某个字符或字符串在源字符串中第一次出现的位置(下标) ...

  5. opencv Mat基础

    Mat Mat由两部分构成 matrix header pointer to the matrix containing the pixel values Mat is basically a cla ...

  6. C#函数的参数传递方式1(值传递与地址传递)

    using System; namespace class1 { class program { static void Main(string[] args) { //值传递引用,实际参数不会变化 ...

  7. go-客户信息关系系统

    客户信息关系系统 项目需求分析 1) 模拟实现基于文本界面的< 客户信息管理软件>. 2) 该软件能够实现对客户对象的插入.修改和删除(用切片实现),并能够打印客户明细表 项目的界面设计 ...

  8. 只想听歌曲的高潮部分?让我用python来教你做个音乐高潮提取器!

    有些时候,我们为了设定手机铃声或者发抖音视频时,会耗费大量时间在音乐剪辑上.尤其是想发布大量抖音视频的时候,我们得收集大量的短音乐,这是一个相当耗费时间的工作.那么,这个音乐高潮的提取能不能自动化呢? ...

  9. CAD画三维图怎么渲染?一分钟教你快速操作

    从事过CAD相关工作的都知道,CAD绘制的方式有二维平面图以及三维图形,三维图形,画三维图方式也是比较简单的.那当然三维图画完后一般还需要进行渲染操作,步骤也是比较简洁的.下面就来给大家操作一下CAD ...

  10. FCC---Use CSS Animation to Change the Hover State of a Button---鼠标移过,背景色变色,用0.5s的动画制作

    You can use CSS @keyframes to change the color of a button in its hover state. Here's an example of ...