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);
}
}
}