题目:http://poj.org/problem?id=1700
分析:
对n(n>3)个人来说,要将用时最长的两人X、Y过河,有两种方按。
已知:TimeOfA<=TimeOfB<=TimeOfX<=TimeOfY
<1> 将用时最短的两个人A、B先过河,然后A划船返回,然后A下船,X、Y过河,B划船返回。该方案耗时
:TimeOfA+TimeOfB+Max(TimeOfA,TimeOfB)+Max(TimeOfX,TimeOfY)=TimeOfA+2*TimeOfB+TimeOfY.
<2> A与Y过河,A划船返回;A与X过河,A划船返回。耗时为:Max(TimeOfA,TimeOfX)+TimeOfA+Max
(TimeOfA,TimeOfY)+TimeOfA=2*TimeOfA+TimeOfX+TimeOfY.
在<1>、<2>方案中选择耗时最小的,然后递归。
参考:http://blog.csdn.net/lin_miao0818/article/details/2975109
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <algorithm>
#include <stack>
#include <queue>
using namespace std;
int p[1000005];
int solve(int n)
{
if(n == 1) return p[0];
if(n == 2) return p[1];
if(n == 3) return p[0] + p[1] + p[2];
else
{
if(2*p[1]<p[0] + p[n-2])
{
return 2*p[1] + p[n-1] + p[0] + solve(n-2);
}
if(2*p[1]>=p[0] + p[n-2])
{
return 2*p[0] + p[n-2] + p[n-1] + solve(n-2);
}
}
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("in.txt","r",stdin);
#endif
int t;
int n;
scanf(" %d",&t);
while(t--)
{
scanf(" %d",&n);
for(int i=0; i<n; i++)
{
scanf(" %d",&p[i]);
}
sort(p,p+n);
printf("%d\n",solve(n));
}
return 0;
}