在一个月黑风高的夜晚,有一群人在河的右岸,想通过唯一的一根独木桥走到河的左岸.在伸手不见五指的黑夜里,过桥时必须借照灯光来照明,不幸的是,他们只有一盏灯.另外,独木桥上最多能承受两个人同时经过,否则将会坍塌.每个人单独过独木桥都需要一定的时间,不同的人要的时间可能不同.两个人一起过独木桥时,由于只有一盏灯,所以需要的时间是较慢的那个人单独过桥所花费的时间.现在输入N(2<=N<1000)和这N个人单独过桥需要的时间,请计算总共最少需要多少时间,他们才能全部到达河左岸.
例如,有3个人甲 乙 丙,他们单独过桥的时间分别为1 2 4,则总共最少需要的时间为7.具体方法是:甲 乙一起过桥到河的左岸,甲单独回到河的右岸将灯带回,然后甲,丙在一起过桥到河的左岸,总时间为2+1+4=7.
第一行为T,表示有T组数据,每组数据有两行
第一行为N,表示有N个人
下面一行有n个数,表示每个人的过河时间
1 #include<stdio.h>
2 #include<algorithm>
3 using namespace std;
4 int a[1005];
5 int main()
6 {
7 int T, n, i;
8 scanf("%d",&T);
9 while(T--)
10 {
11 scanf("%d",&n);
12 for(i = 0; i < n; i++)
13 scanf("%d",&a[i]);
14 sort(a,a+n);
15 int sum = 0;
16 while(n >= 4)
17 {
18 if((a[1] * 2 + a[n-1] + a[0]) > (2 * a[0] + a[n-1] + a[n-2]))
19 { //求出最长的两个人过桥所用的最短时间
20 sum += a[n-1]; //用时最短的和用时最长的一起过去
21 sum += a[0]; //用时最短的回来
22 sum += a[n-2]; //用时最短的和用时第二长的一起过去
23 sum += a[0]; //用时最短的回来
24 }
25 else
26 {
27 sum += a[1]; //最短的和第二短的一起过去
28 sum += a[0]; //最短的回来
29 sum += a[n-1]; //最长的和第二长的一起过去
30 sum += a[1]; //第二短的回来
31 }
32 n -= 2;
33 }
34 if(n == 3)
35 sum += a[1] + a[0] + a[2];
36 else if(n == 2)
37 sum += a[1];
38 else
39 sum += a[0];
40 printf("%d\n",sum);
41 }
42 return 0;
43 }