题目来源:http://acm.nyist.net/JudgeOnline/problem.php?pid=47
资料参考:http://blog.csdn.net/hearthougan/article/details/24009815
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int MAXN = 1010;
int Cross_River(int a[], int n)
{
if(n == 1)
return a[0];
if(n == 2)
return a[1];
if(n == 3)
return a[0]+a[1]+a[2];
if(n >= 4)
{
if(2*a[1] >= a[0] + a[n-2])
return 2*a[0]+a[n-2]+a[n-1] + Cross_River(a, n-2);
else
return 2*a[1]+a[0]+a[n-1] + Cross_River(a, n-2);
}
}
int main()
{
int T, arr[MAXN], n;
scanf("%d", &T);
while(T--)
{
scanf("%d", &n);
memset(arr, 0, sizeof(arr));
for(int i = 0; i < n; ++i)
scanf("%d", &arr[i]);
sort(arr, arr+n);
printf("%d\n", Cross_River(arr, n));
}
return 0;
}