算法筆試題:過橋問題

問題:某夜,有個團伙要過橋,該橋每次只能通行2個人,只有一個手電筒,過橋必須持有手電筒。
   這些人單獨過橋的時長分別爲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);
	}

剛開始做這個問題的時候感覺很難,但是和同學討論了一會兒就感覺懂了,我們一起寫,他用的是遞歸的方式,感覺用遞歸的方式比我的方式簡單,但是我這種方式也是看過了一篇文章纔有的靈感,模仿人家寫的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章