原题: http://poj.org/problem?id=1700
//经典过河问题
//题目大意: 有N个人要过河,但是只有一艘船,每次最多只能坐两个人,而过河后,如果还有人需要渡河,就需要岸上某个人重新把船划回来
// 每个人单独划船的速度已知,两个人一起坐船的速度取决于速度较慢的那个人,问这n个人渡河需要的最少时间
//思路:如果有4个人渡河a,b,c,d,速度由小到大是 t1,t2,t3,t4,问题的关键在于如何把速度最慢的两个人运过去.
// 共有两种方案: ①a,b先过河,a回;c,d过河,b回 时间:t2+t1+t4+t2
// ②a,d先过河,a回;a,c过河,a回 时间:t4+t1+t3+t1
// 每次过河取时间最短的方案,直到最后人数<=3人,我们便可以计算出最终结果
#include<iostream>
#include<algorithm>
#include<cstdio>
using namespace std;
int t[1001]={0};
int cmp(int a,int b)
{
return a<b;
}
int m(int a,int b)
{
if(a<b)return a;
else return b;
}
int main()
{
int k;
scanf("%d",&k);
while(k--)
{
int n;
scanf("%d",&n);
int i;
for(i=1;i<=n;i++)
{
scanf("%d",&t[i]);
}
if(n==1){
printf("%d\n",t[1]);
}else{
sort(t+1,t+n+1,cmp);
int end=n;
int min=0;
while(end>=4){
min=min+m(t[2]+t[1]+t[2]+t[end],t[end]+t[end-1]+2*t[1]);//每次取时间最短的方案
end=end-2;
}
if(end==3){
min=min+t[1]+t[2]+t[3];
}else if(end==2){
min=min+t[2];
}
printf("%d\n",min);
}
}
return 0;
}