您的位置:首页 > 其它

poj1700 crossing river 贪心(手动翻译)

2016-01-25 11:50 120 查看
一组N多人的想过河去,只有一条船,它最多可承载两个人。因此想出一种安排划船来回让所有的人可能过河。每个人都有不同的划船速度;两人一起时速度由较慢的一个速度决定。你的任务是确定策略,花最少的时间让所有人能过河。(提示:船开过去后,还需要有人划回来)

输入

输入的第一行包含一个整数T(1<= T<=20),表示有T组测试数据。接下来T组数据。每组数据第一行为N,第二行包含N个整数表示每个人过河时间。每个案例之前有一个空行。不会超过1000人,没有人需要超过100秒时间。

输出:

每组数据一行,表示N个人全部通过的最少时间。

样例输入:

1

4

1 2 5 10

样例输出:

17

首先如果只有一个人和两个人和三个人要特殊讨论,原因自己理解一下...大于等于四人的时候,大家可以自己模拟一下,就很容易得出结论,因为很简单这里就让大家自己去想了,下面是代码~

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<math.h>
using namespace std;
int a[1001];
bool cmp(int a,int b)
{
return a>b;
}//想不起greater怎么写了....
int work(int s,int e)
{
if(e==s||e-s==1)return a[s];
else if(e-s==2)return a[s]+a[s+1]+a[s+2];
else {
int A=a[e],B=a[e-1],z=a[s],y=a[s+1],s1=0;
if(2*B>=A+y)s1=2*A+z+y;
else s1=2*B+A+z;
}
return s1+work(s+2,e);
}
int main()
{
int t;
cin>>t;
while(t--)
{
int n,i,j,k;
cin>>n;
for(i=1;i<=n;i++)cin>>a[i];
sort(a+1,a+1+n,cmp);
cout<<work(1,n)<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: