Crossing River
题目链接:http://acm.hust.edu.cn/vjudge/problem/visitOriginUrl.action?id=26251
题意:
N个人希望去过河,但每次只能过两个且要有一个人把船划回来接其他的人;
两个人一起过河所用的时间是两个人中单独过河时间最多的;
求所有人过河所需要的最少的时间。
思路分析:
定义一个装n个人中每个人过河所需要的时间数组a[];并用sort进行从小到大进行排序。
求将最慢的和次慢的运过去所需的最少时间,下面有两种可能使所需时间最短的运送的方法:
1)先让最快的和次快的过去且让最快的回来,后要最慢的和次慢的过去让次快的回来;
这样所需要的时间为a[0]+2*a[1]+a[n-1]
2)让最慢的和最快的过去最快的回来;再让最快的和次慢的过去最快的回来;
这样所需要的时间为2*a[0]+a[n-1]+a[n-2]
将这两种方法所需的时间进行比较。
说明:当只有3个人或更少时不管如何过河所需的时间都是他们单独过河所需的时间的总和。
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn=;
int main()
{
int i,j,t,n,sum,a[maxn];
cin>>t;
while(t--)
{
j=;sum=;
cin>>n;
for(i=;i<n;i++)
cin>>a[i];
sort(a,a+n);
for(i=n-;i>;i-=)
if(a[]+*a[]+a[i]<*a[]+a[i]+a[i-])
sum=sum+a[]+*a[]+a[i];
else
sum+=*a[]+a[i]+a[i-];
if(i==)
sum=sum+a[]+a[]+a[];
if(i==)
sum=sum+a[];
if(i==)
sum+=a[];
cout<<sum<<endl;
}
return ;
}