【题目描述】
几个人过河,每次过两人一人回,速度由慢者决定,问过河所需最短时间。
【输入】
输入t组数据,每组数据第1行输入n,第2行输入n个数,表示每个人过河的时间。
【输出】
输出t行数据,每行1个数,表示每组过河最少时间。
【输入样例】
1
4
1 2 5 10
【输出样例】
17
//把要过河的人以时间短长排序,考虑1人2人时,和剩下1人2人时,tt[n]时就能完成
//剩下1人时,可让最短时间的人过来,所用时间就是tt[n-1]+a1+an
//剩下2人时,可让最短时间的人过来,剩下两人一起过去,再让a2过来,a1和a2同时过去。
//tt[n-2]+a1+an+a2+a2 在这两种方案中取个时间少的
//就是一个考虑解法的过程 ,最耗时啊
//Writed by Wangzhimin 2023//11/20
#include<bits/stdc++.h>
using namespace std;
int tt[1005],a[1005];
int main()
{
int n,t,i;
scanf("%d",&n);
while(n--){//有几组
scanf("%d",&t);
for(i=1;i<=t;i++)//从a1开始输入
scanf("%d",&a[i]);
a[0]=0; //为排序用,其它不会
sort(a,a+t+1);//排序
tt[1]=a[1];//1个人时
tt[2]=a[2];//2个人时
for(i=3;i<=t;i++)//3个人及以上时
{
tt[i]=min(tt[i-1]+a[i]+a[1],tt[i-2]+a[1]+a[i]+a[2]+a[2]);
}
printf("%d\n",tt[t]);//输出
}
}