nyoj 47 过河问题

题目47 - ACM在线评测系统  http://acm.nyist.net/JudgeOnline/problem.php?pid=47

就说不能那么简单,原来我考虑的成分确实太少了,首先n==3是个分界点,不信就手动算算,然后n>=4时,考虑先送过去用时最长的两个人,时间排序后

可能情况一:1将 n和n-1 送过去

可能情况二:1和2 先过去,1 送回灯,n和n-1过去,2 再送回灯

代码:

#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
int a[1010];

int min(int a,int b)
{
    return a<b?a:b;
}
int f(int n)
{
    if(n<=2)
        return a[n-1];
    if(n==3)
        return a[0]+a[1]+a[2];
    else
    {
        return f(n-2)+min((a[n-1]+a[0]+a[1]+a[1]),(a[n-1]+a[n-2]+a[0]+a[0]));
    }
}
int main()
{
    int t,n,sum;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d",&n);
        for(int i=0;i<n;i++)
            scanf("%d",&a[i]);
        sort(a,a+n);
        sum=f(n);
        printf("%d\n",sum);
    }
    return 0;
}


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