过桥问题。有N(N≥2)个人在晚上需要从X地到达Y地,中间要过一座桥,过桥需要手电筒(而他们只有1个手电筒),每次最多两个人一起过桥(否则桥会垮)。
N个人的过桥时间依次存入数组t[N]中,分别为:t[0],t[1], ……, t[N-1]。过桥的速度以慢的人为准!
注意:手电筒不能丢过桥!问题是:编程求这N个人过桥所花的最短时间
public class Bridge {
public static void main(String[] args) {
ArrayList<Integer> a = new ArrayList<>();
ArrayList<Integer> b = new ArrayList<>();
// for (int i = 0; i < 1000; i++) {
// a.add((int) (Math.random() * 100+1));
// }
a.add(1);
a.add(2);
a.add(5);
a.add(10);
System.out.println(bridge(a, b, 0));
}
public static int bridge(ArrayList<Integer> a, ArrayList<Integer> b, int sum) {
if (a.size()<2){
sum+=a.get(0);
return sum;
}
//a中最快的先走
sort(a);
b.add(a.get(0));
b.add(a.get(1));
sum += a.get(0) < a.get(1) ? a.get(1) : a.get(0);
a.remove(1);
a.remove(0);
if (a.size() == 0) {
return sum;
}
//b中最快的返回
a.add(b.get(0));
sum += b.get(0);
b.remove(0);
//a中最慢两个的走
sort(a);
b.add(a.get(a.size() - 1));
b.add(a.get(a.size() - 2));
sum += a.get(a.size() - 1) < a.get(a.size() - 2) ? a.get(a.size() - 2) : a.get(a.size() - 1);
a.remove(a.size() - 2);
a.remove(a.size() - 1);
if (a.size() == 0) {
return sum;
}
//b中最快的返回
a.add(b.get(0));
sum += b.get(0);
b.remove(0);
b.remove(0);
return bridge(a, b, sum);
}
public static void sort(ArrayList<Integer> arrayList) {
arrayList.sort(new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o1 - o2;
}
});
}
}