晚上,有四个人过河,分别需要1、2、5、10分钟。只有一把手电筒,过河的必要条件是有手电筒。最多可以两个人同时过河,但必须以两人中较慢的那个人的速度过去。问:所有人都过河,至少需几分钟。用java实现

找实习工作遇到的笔试题:

解题思路:用两个集合分别代表河的两岸(list2表示对岸),利用双重for循环模拟A,B,C,D分别组合过河,如:A,B先过河,则,将A,B都添加到list2集合中去。如果A的时间大于B,则B再次过河送手电筒,再一次将B添加到集合中去。反之同理。

总之,时间短的过河送手电筒,这样过河一次,就添加到集合中去一次,最后foreach出list2集合中的所有元素相加,得到所有可能得到的时间。


public class ttt {
private List<Integer> list = new ArrayList<Integer>();
private List<Integer> list2 = new ArrayList<Integer>();
private int sum=0;

@Test
public void test(){
int sum = 0;
list.add(1);
list.add(2);
list.add(5);
list.add(10);
for (int i = 0; i < list.size()-1; i++) {
for (int j = 1; j < list.size(); j++) {
if (list.get(i)<list.get(j)) {
list2.add(list.get(j));//i,j元素到对岸
list2.add(list.get(i));//i元素回去送手电筒
//判断之前没过河剩下的两个元素时间大小,大的添加到集合中去
if (list.get(list.size()-i-1)<list.get(list.size()-j-1)) {
list2.add(list.get(list.size()-j-1));
}else {
list2.add(list.get(list.size()-i-1));
}
list2.add(list.get(j));//第一批过河那个大的元素回去接小的
list2.add(list.get(j));//一起过河
for (int num : list2) {//遍历出所有元素并相加
// System.out.println(num);
sum +=num;

}
System.out.println("sum="+sum);
list2.clear();
sum = 0;
}//else{
// list2.clear();
// list2.add(list.get(i));
// list2.add(list.get(j));
// if (list.get(list.size()-i-1)<list.get(list.size()-j-1)) {
// list2.add(list.get(list.size()-j-1));
// }else {
// list2.add(list.get(list.size()-i-1));
// }
// list2.add(list.get(i));
// list2.add(list.get(j));
// for (int num : list2) {
// sum +=num;
// }
//// System.out.println(sum);
// list2.clear();
// sum = 0;
// }

}
}
}


}

猜你喜欢

转载自blog.csdn.net/qq_wzs/article/details/79567379