题目链接:http://acm.timus.ru/problem.aspx?space=1&num=1826
| input | output |
|---|---|
4 1 10 5 2 |
17 |
题意:
有n个人要经过一片雷区,但是他们只有一个扫雷用的探测器,所以每次只能过去两个人,其中一个人把探测器拿回来,继续再过去两个人,
每个人的行走速度不同,所花费的时间,是按照两个人中较慢的那个人所用时间计算的!
求全部人通过雷区的最短时间!
PS:
每次先把最大的两个移过去,当人数大于等于4的时候,
分两种情况:
1:最小的来回几次把最大的两个带过去。
2:先让最小的两个过去,然后最小的把探测器的回来,然后最大的两个过去,对面最小的把探测器带回来。
代码如下:
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int a[147];
int ans = 0;
void cal(int m)
{
if(m == 1)
{
ans+=a[0];
}
else if(m == 2)
{
ans+=a[1];
}
else if(m == 3)
{
ans+=a[0]+a[1]+a[2];
}
else
{
if((a[0]*2+a[m-1]+a[m-2]) < (a[0]+2*a[1]+a[m-1]))
{
ans+=a[0]*2+a[m-1]+a[m-2];//0号一个人来回
}
else
{
ans+=a[0]+2*a[1]+a[m-1];//0,1号两个人来回
}
cal(m-2);
}
}
int main()
{
int n;
while(~scanf("%d",&n))
{
for(int i = 0; i < n; i++)
{
scanf("%d",&a[i]);
}
sort(a,a+n);
cal(n);
printf("%d\n",ans);
}
return 0;
}原文地址:http://blog.csdn.net/u012860063/article/details/44279717