http://acm.nyist.net/JudgeOnline/problem.php?pid=47
#include<string.h>
#include<iostream>
#include<algorithm>
using namespace std;
#define N 1010
int a[N];
int cmp(int m)
{
if(m==1) return a[0];
if(m==2) return a[1];
if(m==3) return a[0]+a[1]+a[2];
if(m>=4) //a[0],a[1]将a[m-1],a[m-2]送到对岸后再返回继续进行
{
if(a[0]+a[m-2]>2*a[1]) //注意a[m-1],a[m-2]在这里不要用a[2],a[3]代替
return a[0]+2*a[1]+a[m-1]+cmp(m-2); //a[m-1]a[m-2]分别表示倒数第一位倒数第二位
else
return 2*a[0]+a[m-2]+a[m-1]+cmp(m-2);
}
}
int main()
{
int T,n,time,i;
cin>>T;
while(T--)
{
memset(a,0,sizeof(a));
cin>>n;
for(i=0;i<n;i++)
{
cin>>a[i];
}
sort(a,a+n); //先对时间进行升序排列
time=cmp(n);
cout<<time<<endl;
}
return 0;
}
#include<string.h>
#include<iostream>
#include<algorithm>
using namespace std;
#define N 1010
int a[N];
int cmp(int m)
{
if(m==1) return a[0];
if(m==2) return a[1];
if(m==3) return a[0]+a[1]+a[2];
if(m>=4) //a[0],a[1]将a[m-1],a[m-2]送到对岸后再返回继续进行
{
if(a[0]+a[m-2]>2*a[1]) //注意a[m-1],a[m-2]在这里不要用a[2],a[3]代替
return a[0]+2*a[1]+a[m-1]+cmp(m-2); //a[m-1]a[m-2]分别表示倒数第一位倒数第二位
else
return 2*a[0]+a[m-2]+a[m-1]+cmp(m-2);
}
}
int main()
{
int T,n,time,i;
cin>>T;
while(T--)
{
memset(a,0,sizeof(a));
cin>>n;
for(i=0;i<n;i++)
{
cin>>a[i];
}
sort(a,a+n); //先对时间进行升序排列
time=cmp(n);
cout<<time<<endl;
}
return 0;
}