贪心问题。
先排序,然后 1 2 过去,1 回来,最大的两个过去,然后2回来,一次带过2个最大的。
还有一种情况就是这样不划算,就直接过去。比较这两个大小然后选择。
POJ AC代码:
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int n,a[1001],i;
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%d",&a[i]);
sort(a,a+n);
int ans=0;
while(n>3)
{
ans+=min(a[1]+a[0]+a[1]+a[n-1],a[0]+a[0]+a[n-1]+a[n-2]);
n-=2;
}
if(n==3)
ans+=a[1]+a[0]+a[2];
else if(n==2)
ans+=a[1];
else if(n==1)
ans+=a[0];
printf("%d\n",ans);
}
}