1. 程式人生 > >晚上,有四個人過河,分別需要1、2、5、10分鐘。只有一把手電筒,過河的必要條件是有手電筒。最多可以兩個人同時過河,但必須以兩人中較慢的那個人的速度過去。問:所有人都過河,至少需幾分鐘。用java實現

晚上,有四個人過河,分別需要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;
// }

}
}
}


}