贪心。
假设有速度最快的人a、速度次快的人b,速度最慢的人c,速度次慢的人d,把c和d送到终点考虑两种策略:
1、 a和b出发,a回来,c和d出发,b回来
2、 a和c出发,a回来,a和d出发,a回来
只需要比较这两种策略的快慢,每次选择较快的策略,当起点的人数少于4时直接处理,即可得出结果。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
int a[1000+5];
int main(){
int t;
scanf("%d",&t);
while(t--){
int n;
scanf("%d",&n);
for(int i=0;i<n;i++) scanf("%d",&a[i]);
sort(a,a+n);
int ans=0;
while(n>0){
if(n==1){
ans+=a[0];
break;
}
if(n==2){
ans+=a[1];
break;
}
if(n==3){
ans+=a[2]+a[0]+a[1];
break;
}
if(n>=4){
ans+=min(a[1]+a[0]+a[n-1]+a[1],a[n-2]+a[0]+a[n-1]+a[0]);
n=n-2;
}
}
cout<<ans<<endl;
}
return 0;
}