点击打开链接
///如何把两个肥的渡过敲,花费最小。用两个最少的打辅助。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<string>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<math.h>
using namespace std;
int Arr[1005];
int main()
{
int T=0,N=0,i=0,sum=0,temp1=0,temp2=0;
scanf("%d",&T);
while(T--){
scanf("%d",&N);
for(i=1;i<=N;i++){
scanf("%d",&Arr[i]);
}
sort(Arr+1,Arr+1+N);
sum=0;
while(N>3){
temp1=Arr[2]+Arr[1]+Arr[N]+Arr[2];///由于同时可以过两个人,因此可以考虑最快的与次快的过河,最快的回来,最慢的与次慢的过河,次快回来,以此节省次慢的过河时间
temp2=Arr[N]+Arr[1]+Arr[N-1]+Arr[1];///而另一种最容易考虑到的自然是最快的送最慢的过河,然后最快的回来,此时次慢变为最慢,再让最快的送其过河,最快再回来……
sum+=min(temp1,temp2);
N-=2;
}
if(N==1) sum+=Arr[1];
else if(N==2) sum+=Arr[2];
else if(N==3) sum+=Arr[1]+Arr[2]+Arr[3];
printf("%d\n",sum);
}
return 0;
}