1. 程式人生 > >貪心演算法-過河問題

貪心演算法-過河問題

POJ題目連結:http://poj.org/problem?id=1700
N個人過河,船每次最多隻能坐兩個人,船載每個人過河的所需時間不同,問最快的過河時間。

思路:

當n=1,2,3時所需要的最小時間很容易求得,現在由n>=4,假設n個人單獨過河所需要的時間儲存在陣列t中,將陣列t按升序排序,那麼 這時將單獨過河所需要時間最多的兩個旅行者送到對岸去,有兩種方式:

      1> 最快的(即所用時間t[0])和次快的過河,然後最快的將船劃回來,再次慢的和最慢的過河,然後次快的將船劃回來.

          即所需時間為:t[0]+2*t[1]+t[n-1]
      2> 最快的和最慢的過河,然後最快的將船劃回來,再最快的和次慢的過河,然後最快的將船劃回來.

          即所需時間為:2*t[0]+t[n-2]+t[n-1]

          這樣就將過河所需時間最大的兩個人送過了河,而對於剩下的人,採用同樣的處理方式,接下來做的就是判斷怎樣用的時間最少.

--------------------- 
作者:痕跡天涯119 
來源:CSDN 
原文:https://blog.csdn.net/u014492609/article/details/40918435 
版權宣告:本文為博主原創文章,轉載請附上博文連結!

package tt;
import java.util.*;
public class Main {
    public static void main(String args[]) {
        Scanner in=new Scanner(System.in);
        int cnt=in.nextInt();
        while(cnt>0) {
            cnt--;
            int n=in.nextInt();
            int arr[]=new int[n];
            for(int i=0;i<n;i++) {
                arr[i]=in.nextInt();
            }
            //排序
            Arrays.sort(arr);
            int sum=0;
            //從大到小一對一對的送走
            for(int i=n-1;i>=0;i--) {
                //判斷i的數值做處理
                if(i==0) {
                    sum+=arr[0];
                    i=-1;
                }else if(i==1) {
                    sum+=arr[1];
                    i=-1;
                }else if(i==2) {
                    sum+=arr[0]+arr[1]+arr[2];
                    i=-1;
                }
                else if(i>=3){
                    sum+=Math.min(arr[0]+2*arr[1]+arr[i], 2*arr[0]+arr[i]+arr[i-1]);
                    i--;
                }
            }
            System.out.println(sum);
        }
    }
}