這些人單獨過橋的時長分別爲t1、t2、t3、t4、t5 ……tn。
誰能設計程序計算出這夥人過橋需要的最短時間?
解題思路:兩種方案過橋
2t1 進行對比 t1+t(n-1);
1、12充當運輸車的作用,每次1,2 去,1回,另外的去,2再回(2t1 < t1+t(n-1))
2、1充當運輸車,每次都和另一個人走,1回來(2t1 > t1+t(n-1))
public static void GoThroughBridge() {
System.out.println("請輸入過橋的人數");
Scanner scan = new Scanner(System.in);
int N = scan.nextInt();
int[] arr = new int[N];
System.out.println("請輸入每個人過橋的時間");
for(int i = 0;i<N;i++) {
arr[i] = scan.nextInt();
}
//把過橋的時間從小到大排序
Arrays.sort(arr);
/*
* 做題的時候用的是數組,所以a1 對應的是arr[0]
* */
//執行的總時間
int totalTime = 0;
//false 爲單人運,true 爲雙人運
boolean flag = false;
//每次需要比較的是 2a2 == a1+a(n-1);
if(N==1) totalTime = arr[0];
else if(N==2) totalTime = arr[1];
else if(N==3) totalTime = arr[0] +arr[1] + arr[2];
else {
//等式左邊的值是固定的
int left = 2*arr[1];
//a1,a2 走的時間
int usualTime = arr[0]+arr[1];
for(int i = 0;i<(N-2)/2;i++) {//走的來回次數
//數組是從0開始的所以要減兩次1
if(2*arr[1] <arr[0]+arr[N-2*i-1-1]) {
totalTime += usualTime;//a1,a2走的時間包括a1返回
totalTime += arr[N - 2*i - 1] + arr[1];//最慢兩個人走的時間,包括a2返回
}else {
//這裏運用了類似遞歸的方法,每次只計算2個
totalTime += arr[0] * 2;
for (int j = N - 2*i -2 ; j <= N - 2*i -1; j++){
totalTime += arr[j];
}
flag = true;
if(N - 2*i - 1 <= 1) {
break;
}
}
}
if (1 == N % 2){
totalTime += arr[0] + arr[1] + arr[2];
}
if(0 == N % 2){
totalTime += arr[1];
}
}
System.out.println(totalTime);
}
剛開始做這個問題的時候感覺很難,但是和同學討論了一會兒就感覺懂了,我們一起寫,他用的是遞歸的方式,感覺用遞歸的方式比我的方式簡單,但是我這種方式也是看過了一篇文章纔有的靈感,模仿人家寫的。