题意是让n个人过河然后通过的时间最短,而且只有一条船,所以过完河的人还要有一个人将船划会对岸,最开始想到的是让时间最短额人依次配每个人个过河,但是这不是最简单的,因为我们可以设想让时间最长的人和次长的人过河,而让时间最短和次短的人当作不断划船的人。
但是,这里涉及了一个比较,就是是让时间最短的人依次配他们过的时间最短还是才用第二种方法,所以这里涉及到一个判断的,代码如下:
#include<iostream>
#include<cstdlib>
using namespace std;
int a[1005];
int cmp(const void *a,const void *b)
{
return *(int *)a-*(int *)b;
}
int main()
{
int n,m,i,j,k;
cin>>n;
while(n--)
{
cin>>m;
for(i=0; i<m; i++)
cin>>a[i];
qsort(a,m,sizeof(int),cmp);
int sum=0;
int i=m-1;
if(i==0)
sum+=a[0];
while(i>0)
{
if(i==1)
sum+=a[1];
else if(i==2)
sum+=a[1]+a[0]+a[2];
else
{
if(2*a[1]>a[0]+a[i-1])
sum+=2*a[0]+a[i]+a[i-1];
else
sum+=a[0]+a[i]+a[1]*2;
}
i=i-2;
}
cout<<sum<<endl;
}
return 0;
}