java 实现N个女人过桥问题
2016-05-14 17:15
661 查看
题目描述:
N个女人过桥,夜间有一火把,每次最多过两个,必需带火把,过桥速度不一样。过去后必须回来一个人,把火把带回来。要求女人都过去,实现最小过桥时间。
如果4个女人过桥,时间为1,2,5,10,那么最小时间是17。
思路:
在未过桥中选最少时间的两个人过桥,当过桥后选最少时间的人返回,此时火把交给返回的人,同时对己过桥的人进行统计,当还有三人未过桥时(包含返的人),
让时间最大的两个人过桥,后将为把交给过桥后最少时间的再返回,最后两个最少时间的人过桥。
比如1,2,5,9,10, 那么1,2 先过1回来,1,5过,1回来,剩3个的时候, 9,10过,2回来, 1,2过,OK
代码实现:
N个女人过桥,夜间有一火把,每次最多过两个,必需带火把,过桥速度不一样。过去后必须回来一个人,把火把带回来。要求女人都过去,实现最小过桥时间。
如果4个女人过桥,时间为1,2,5,10,那么最小时间是17。
思路:
在未过桥中选最少时间的两个人过桥,当过桥后选最少时间的人返回,此时火把交给返回的人,同时对己过桥的人进行统计,当还有三人未过桥时(包含返的人),
让时间最大的两个人过桥,后将为把交给过桥后最少时间的再返回,最后两个最少时间的人过桥。
比如1,2,5,9,10, 那么1,2 先过1回来,1,5过,1回来,剩3个的时候, 9,10过,2回来, 1,2过,OK
代码实现:
package NWomenCrossBridge; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.LinkedList; import java.util.List; import java.util.Queue; import java.util.Stack; import org.apache.log4j.Logger; public class NWomenCrossBridge { private Logger logger = Logger.getLogger(NWomenCrossBridge.class); private static NWomenCrossBridge instance = null; private static Stack<Integer> UnCross = null; private static Queue<Integer> Crossed = null; private static int timeCost = 0; public static NWomenCrossBridge getInstance(Integer... needTime) { if(instance == null) { return new NWomenCrossBridge(needTime); } return instance; } private NWomenCrossBridge(Integer... needTime) { UnCross = new Stack<Integer>(); Crossed = new LinkedList<Integer>();//队列 setTime(needTime); } public void setTime(Integer... needTime) { List<Integer> list = new ArrayList<Integer>(); list = Arrays.asList(needTime); Collections.sort(list); for(int i=list.size()-1;i>=0;i--) UnCross.push(list.get(i)); } public void crossBridge() { Integer first = null; Integer second = null; Integer third = null; int count = 1; while(UnCross.size()>0) { if(UnCross.size()>3) { first = UnCross.pop(); second = UnCross.pop(); Crossed.offer(second); timeCost += second;//过桥时间 UnCross.push(first); timeCost += first; //回程时间 logger.info("第" + count + "次,"+ first +" 和 " + second + " 同过桥, " + first + " 返回"); count++; } else if(UnCross.size() == 3){ first = UnCross.pop(); second = UnCross.pop(); third = UnCross.pop(); Crossed.offer(second); Crossed.offer(third); timeCost += third;//过桥时间 Integer goBack = Crossed.poll();//已过桥的,把其中最小的拿出来返回 timeCost += goBack;//回程时间 logger.info("第" + count + "次,"+ second +" 和 " + third + " 同过桥, " + goBack + " 返回"); count++; Crossed.offer(first); Crossed.offer(goBack); timeCost += goBack; logger.info("第" + count + "次,"+ first +" 和 " + goBack + " 同过桥"); } } logger.info("总过桥次数为: " + count + " 总过桥时间为: " + timeCost); } public static void main(String[] args) { NWomenCrossBridge nWomenCrossBridge = NWomenCrossBridge.getInstance(1,2,5,9,10); //时间指定,可以无序 nWomenCrossBridge.crossBridge(); } }
相关文章推荐
- JDK API文档下载
- java中Comparator的用法
- spring factory-method
- MyEclipse8.5破解方法
- Runnable、Callable和Future
- 【JAVA基础系列】IEEE754二进位浮点算数标准-JAVA转换器实现
- JAVA多线程之volatile 与 synchronized 的比较
- Spring——jar包详解
- 可能忽略的Java基础知识-小心使用synchronized和volatile
- java消息队列使用场景
- Exception occurred during code generation for WSDL
- Spring-EhCache配置实例
- Java 泛型
- 2016 百度之星 B题(java实现)
- Java获取泛型的实际类型
- java 内存:重排序
- Struts2 是如何避免表单的重复提交的呢?
- java多线程
- Java开发中的23种设计模式详解(转)
- JavaWeb学习笔记——JSTL核心标签库