您的位置:首页 > 其它

nyoj 47 过河问题

2016-04-22 22:33 381 查看
题目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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: