貪心演算法-過河問題
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);
}
}
}