贪心算法-过河问题

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

猜你喜欢

转载自blog.csdn.net/anhuibozhoushatu/article/details/83545780