过河问题

http://blog.csdn.net/cscj2010/article/details/7240284
http://acm.nyist.net/JudgeOnline/problem.php?pid=47

思路:按耗时排序后,每次先让最快的两个人AB过去,回来一个A,让这边最慢的两个人过去,回来B,这样方案形成的格局就是剩下的人耗时最少,传递手电筒耗时也是最少,如此循环,直到剩余小于4个人。
提交后结果WA了,少考虑情况了,比如最快的AB,B却比A慢得多,这样就不如两次都让A传递手电筒

 
#include
#include
#include
using namespace std;
int arr[1010];
int f(int n)
{
    int sum=0;
    while(n>3)
    {
        if(arr[2]+arr[2]<+arr[n-1]+arr[1])//if(arr[1]+arr[2]+arr[n]+arr[2]>arr[n]+arr[1]+arr[n-1]+arr[1])
        {
            sum+=arr[1]+arr[2]+arr[n]+arr[2];
        }
        else{
            sum+=arr[n]+arr[1]+arr[n-1]+arr[1];
        }
        n-=2;
    }
    if(n==3)  sum+=arr[3]+arr[1]+arr[2];
    else if(n==2) sum+=arr[2];
    else if(n==1) sum+=arr[1];
    return sum;
}
int main()
{
        int t;
        scanf("%d",&t);
        while(t--)
        {
            int n;
            scanf("%d",&n);
            for(int i=1;i<=n;i++)
            {
                scanf("%d",arr+i);
            }
            sort(arr+1,arr+n+1);
            printf("%d\n",f(n));
        }
}

你可能感兴趣的:(过河问题)