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<cstdio>
#include<algorithm>
#include<cmath>
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));
}
}