- 浏览: 459883 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
ty1972873004:
sunwang810812 写道我运行了这个例子,怎么结果是这 ...
Java并发编程: 使用Semaphore限制资源并发访问的线程数 -
lgh1992314:
simpleDean 写道请问,Logger.setLevel ...
Java内置Logger详解 -
sunwang810812:
我运行了这个例子,怎么结果是这样的:2号车泊车6号车泊车5号车 ...
Java并发编程: 使用Semaphore限制资源并发访问的线程数 -
jp260715007:
nanjiwubing123 写道参考你的用法,用如下方式实现 ...
面试题--三个线程循环打印ABC10次的几种解决方法 -
cb_0312:
SurnameDictionary文章我没看完,现在懂了
中文排序
本文用代码实现最短时间过桥,并且打印如下两个例子的最小过桥时间:
例子一:四人夜间过桥,他们只有一个手电筒一次只能两个人过桥,过桥时必须有手电筒,四人过桥时间为1分2分6分10分
例子二:小明过桥要一秒,小明的弟弟要三秒,小明的爸爸要六秒,小明的妈妈要八秒,小明的爷爷要十二秒。每次此桥最多可过两人,而过桥的速度,依过桥最慢者而定,可是灯在点燃后, 三十秒就会熄灭(过桥需要灯照明)。那么,请问小明一家,如何在三十秒内过桥?
代码:
测试代码
测试结果输出:
Example 1 ->
四人夜间过桥,他们只有一个手电筒一次只能两个人过桥,过桥时必须有手电筒,四人过桥时间为1分2分6分10分
1 2 -->
1 <-- Back
6 10 -->
2 <-- Back
1 2 -->
最少过桥耗时 17 秒!
Example 2 ->
小明过桥要一秒,小明的弟弟要三秒,小明的爸爸要六秒,小明的妈妈要八秒,小明的爷爷要十二秒。
每次此桥最多可过两人,而过桥的速度,依过桥最慢者而定,可是灯在点燃后, 三十秒就会熄灭。
那么,请问小明一家,如何在三十秒内过桥?
1 3 -->
1 <-- Back
8 12 -->
3 <-- Back
1 3 -->
1 <-- Back
1 6 -->
最少过桥耗时 29 秒!
转载请注明:http://mouselearnjava.iteye.com/blog/2051541
例子一:四人夜间过桥,他们只有一个手电筒一次只能两个人过桥,过桥时必须有手电筒,四人过桥时间为1分2分6分10分
例子二:小明过桥要一秒,小明的弟弟要三秒,小明的爸爸要六秒,小明的妈妈要八秒,小明的爷爷要十二秒。每次此桥最多可过两人,而过桥的速度,依过桥最慢者而定,可是灯在点燃后, 三十秒就会熄灭(过桥需要灯照明)。那么,请问小明一家,如何在三十秒内过桥?
代码:
import java.util.ArrayList; import java.util.Collections; import java.util.List; /** * @author Eric */ public class CrossBridge { /** * @param personSpeeds * 每个人过桥所需时间的一个列表 */ public void crossBridge(List<Integer> personSpeeds) { if (null == personSpeeds || 0 == personSpeeds.size()) { throw new IllegalArgumentException("至少有一个人需要过桥,请保证参数至少有一个元素。"); } else if (!isSpeedParameterLeagal(personSpeeds)) { throw new IllegalArgumentException("请纠正过桥时间,每个人的过桥时间不能小于等于零。"); } else if (1 == personSpeeds.size()) { // 只有一个人过桥,那么直接输出过桥过桥时间 System.out.printf("%d -> Go \n", personSpeeds.get(0)); System.out.printf("最少过桥耗时 %s 秒!\n", personSpeeds.get(0)); } else if (2 == personSpeeds.size()) { // 只有两个人过桥,那么直接输出过桥过桥时间 System.out.printf("%d %d -> Go \n", personSpeeds.get(0), personSpeeds.get(1)); System.out.printf("最少过桥耗时 %d 秒!\n", personSpeeds.get(0) + personSpeeds.get(0)); } else { // 处理多个人过桥的场景 // 为了获取过桥时间的最大最小值,首先对personSpeeds排序 Collections.sort(personSpeeds); doBridgeCross(personSpeeds); } } private void doBridgeCross(List<Integer> personSpeeds) { List<Integer> source = new ArrayList<Integer>(); source.addAll(personSpeeds); List<Integer> destination = new ArrayList<Integer>(); int totalCrossBridgeTime = 0; boolean secondFastestOnDest = false; while (!source.isEmpty()) { int srcFastest = source.get(0); int srcSecondFastest = source.get(1); if (2 == source.size()) { totalCrossBridgeTime += populateBridgeCrossingTime(source, destination, srcFastest, srcSecondFastest, false); } else { // 处理多余两个人过桥的情况 if (secondFastestOnDest) { // 计算出最慢的两个 int srcSlowest = source.get(source.size() - 1); int srcSecondSlowest = source.get(source.size() - 2); if (destination.get(0) * 2 < srcFastest + srcSecondSlowest) { secondFastestOnDest = false; totalCrossBridgeTime += populateBridgeCrossingTime( source, destination, srcSecondSlowest, srcSlowest, true); } else { totalCrossBridgeTime += populateBridgeCrossingTime( source, destination, srcFastest, srcSlowest, true); } } else { // 最快的两个人过去 secondFastestOnDest = true; totalCrossBridgeTime += populateBridgeCrossingTime(source, destination, srcFastest, srcSecondFastest, true); } } } // 输出花费的时间 System.out.printf("最少过桥耗时 %d 秒!\n", totalCrossBridgeTime); } /** * 计算过桥的时间,如果需要拿灯回来,则需要将回来的时间也算上。 */ private int populateBridgeCrossingTime(List<Integer> source, List<Integer> destination, int fastOne, int slowOne, boolean needReturnLight) { int sp1 = source.remove(source.indexOf(fastOne)); int sp2 = source.remove(source.indexOf(slowOne)); destination.add(sp1); destination.add(sp2); System.out.printf("%d %d --> Go \n", sp1, sp2); // 耗时多的那个 int elapsedTime = sp2; if (needReturnLight) { Collections.sort(destination); // 拿灯返回 sp1 = destination.remove(0); source.add(sp1); Collections.sort(source); elapsedTime += sp1; // sb.append(sp1).append("\n"); System.out.printf("%d <-- Back \n", sp1); } return elapsedTime; } /** * 保证每个人过桥的时间都大于0 */ private boolean isSpeedParameterLeagal(List<Integer> personSpeeds) { /* * 每个人的过桥时间都必须大于0 */ for (int i : personSpeeds) { if (i <= 0) { return false; } } return true; } }
测试代码
import java.util.Arrays; import java.util.List; public class CrossBridgeText { public static void main(String[] args) { CrossBridge cb = new CrossBridge(); System.out .println("Example 1 -> \n四人夜间过桥,他们只有一个手电筒一次只能两个人过桥,过桥时必须有手电筒,四人过桥时间为1分2分6分10分\n"); List<Integer> personSpeeds1 = Arrays.asList(1, 2, 6, 10); cb.crossBridge(personSpeeds1); System.out .println("\nExample 2 -> \n小明过桥要一秒,小明的弟弟要三秒,小明的爸爸要六秒,小明的妈妈要八秒,小明的爷爷要十二秒。\n每次此桥最多可过两人,而过桥的速度,依过桥最慢者而定,可是灯在点燃后, 三十秒就会熄灭。\n 那么,请问小明一家,如何在三十秒内过桥?"); List<Integer> personSpeeds2 = Arrays.asList(1, 3, 6, 8, 12); cb.crossBridge(personSpeeds2); } }
测试结果输出:
Example 1 ->
四人夜间过桥,他们只有一个手电筒一次只能两个人过桥,过桥时必须有手电筒,四人过桥时间为1分2分6分10分
1 2 -->
1 <-- Back
6 10 -->
2 <-- Back
1 2 -->
最少过桥耗时 17 秒!
Example 2 ->
小明过桥要一秒,小明的弟弟要三秒,小明的爸爸要六秒,小明的妈妈要八秒,小明的爷爷要十二秒。
每次此桥最多可过两人,而过桥的速度,依过桥最慢者而定,可是灯在点燃后, 三十秒就会熄灭。
那么,请问小明一家,如何在三十秒内过桥?
1 3 -->
1 <-- Back
8 12 -->
3 <-- Back
1 3 -->
1 <-- Back
1 6 -->
最少过桥耗时 29 秒!
转载请注明:http://mouselearnjava.iteye.com/blog/2051541
发表评论
-
工厂类中移除if/else语句
2016-07-10 19:52 850面向对象语言的一个强大的特性是多态,它可以用来在代码中移除 ... -
Java编程练手100题
2014-12-11 17:13 6668本文给出100道Java编程练手的程序。 列表如下: 面 ... -
数组复制的三种方法
2014-11-30 12:57 2175本文将给出三种实现数组复制的方法 (以复制整数数组为例)。 ... -
数组复制的三种方法
2014-11-30 12:54 0本文将给出三种实现数组复制的方法 (以复制整数数组为例)。 ... -
四种复制文件的方法
2014-11-29 13:21 1683尽管Java提供了一个类ava.io.File用于文件的操 ... -
判断一个字符串中的字符是否都只出现一次
2014-11-25 12:58 2653本篇博文将给大家带来几个判断一个字符串中的字符是否都只出现一 ... -
使用正则表达式判断一个数是否为素数
2014-11-23 13:35 2103正则表达式能够用于判断一个数是否为素数,这个以前完全没有想过 ... -
几个可以用英文单词表达的正则表达式
2014-11-21 13:12 3695本文,我们将来看一下几个可以用英文单词表达的正则表达式。这些 ... -
(广度优先搜索)打印所有可能的括号组合
2014-11-20 11:58 1914问题:给定一个正整n,作为括号的对数,输出所有括号可能 ... -
随机产生由特殊字符,大小写字母以及数字组成的字符串,且每种字符都至少出现一次
2014-11-19 14:48 3937题目:随机产生字符串,字符串中的字符只能由特殊字符 (! ... -
找出1到n缺失的一个数
2014-11-18 12:57 3113题目:Problem description: You h ... -
EnumSet的几个例子
2014-11-14 16:24 8705EnumSet 是一个与枚举类型一起使用的专用 Set 实现 ... -
给定两个有序数组和一个指定的sum值,从两个数组中各找一个数使得这两个数的和与指定的sum值相差最小
2014-11-12 11:24 3282题目:给定两个有序数组和一个指定的sum值,从两个数组 ... -
Java面试编程题练手
2014-11-04 22:49 6650面试编程 写一个程序,去除有序数组中的重复数字 编 ... -
Collections用法整理
2014-10-22 20:55 9796Collections (java.util.Collect ... -
The Code Sample 代码实例 个人博客开通
2014-09-04 18:48 1369个人博客小站开通 http://thecodesample. ... -
Collections.emptyXXX方法
2014-06-08 13:37 2101从JDK 1.5开始, Collections集合工具类中预先 ... -
这代码怎么就打印出"hello world"了呢?
2014-06-08 00:37 7354for (long l = 4946144450195624L ... -
将数组分割成差值最小的子集
2014-04-20 22:34 2836本文使用位掩码实现一个功能 ==》将数组分割成差值最小的子集 ... -
打印一个数组所有的非空子集
2014-04-20 13:02 2365采用位掩码实现打印给 ...
相关推荐
四人过桥的编程实现,参考博文https://blog.csdn.net/zb872676223/article/details/80205953
C++实现的数据结构的课程设计,四人过桥题目,算法实现,内含源代码,解决需要求得最短路径问题、有四个人打算过河,这个桥每次最多只能有两个人通过,他们都在桥的某一段,并且是在晚上,过桥需要一只手电筒,而...
这个题目是求N个人(N由自己输入)过桥的最少时间,规则是晚上过桥,只有一个火把,每次最多两个人一起过桥,每个人的过桥时间不一样(每个人过桥的时间由用户输入),两个人一起过去的时候以过桥时间最大的那个人...
某论坛谈论的不同语言的过桥算法。。。。。
Flash益智游戏-过桥Flash8源文件,在一个风雨交加的夜晚,有一家5口人,他们需要过一座桥,他们每个人过桥所需的时间为1、3、6、8、12分钟,而他们只有一盏灯可使用30分钟,且这座同能只能承载2个人过桥,请问如何在...
火车过桥问题.pdf
本文给出了过桥用时最少的一种方法。并不保证采用其他方法仍然可以达到该值。可以肯定,采用其他方法所用时间不能小于采用本文方法所用时间。
通过分析过桥的结构特点,同时进行车辆台架运行实验取得实验数据,分析出在高速运行时轴承温升过快是导致过桥结构产生故障的主要原因。通过增大过桥轴向安装间隙以及更换大游隙轴承的方法对过桥结构进行改进。实验结果...
这个题目是求N个人(N由自己输入)过桥的最少时间,规则是晚上过桥,只有一个火把,每次最多两个人一起过桥,每个人的过桥时间不一样(每个人过桥的时间由用户输入),两个人一起过去的时候以过桥时间最大的那个人...
行业资料-交通装置-SPMT运输车辅助过桥钢梁结构及使用该结构的过桥方法.zip
移动荷载过桥案例,适用于桥梁动力学分析,摘录自王新敏教授编辑的书籍。
大班语言小熊过桥 PPT课件.pptx
幼儿园中班语言儿歌小熊过桥.pptx
移动车辆过桥的ansys源程序,很好的材料,建议在ANSYS下试试。
幼儿面试体育《小猫过桥》教师资格证面试真题模板.pdf
介绍了一种新型的极薄煤层过桥式采煤机的设计,从针对此类煤层的特殊配套,到整体布局及结构设计;从机械传动的稳定性、安全性的功能保障,到同类其他方式采煤设备的比较,进行了比较全面的介绍及研究。
用进程模拟车辆过桥,利用linux进程间通信知识
利用ABAQUS实现车辆过桥的仿真,具有较好的操作性
包括生产者消费者问题和猴子过桥问题的源代码实现,用C#实现的,带可视化界面,并且包含一个猴子过桥问题exe的安装包生产工程。
煤矿井下运输巷的带式输送机在安装使用后,人员在横向通过输送带时易出现意外等不安全因素,采用机械原理制作的简易输送带过桥,方便了人员横向通过输送带,保证了人员通过输送带时的安全。