首页 > 其他 > 详细

URAL 1826. Minefield(数学啊 递归)

时间:2015-03-15 19:47:43      阅读:253      评论:0      收藏:0      [点我收藏+]

题目链接:http://acm.timus.ru/problem.aspx?space=1&num=1826



1826. Minefield

Time limit: 0.5 second
Memory limit: 64 MB
To fulfill an assignment, a reconnaissance group of n people must cross the enemy‘s minefield. Since the group has only one mine detector, the following course of action is taken: two agents cross the field to the enemy‘s side and then one agent brings the mine detector back to the remaining group. This is repeated until only two agents remain. These two agents then cross the field together.
Each person gets across the field at their own speed. The speed of a pair is determined by the speed of its slower member.
Find the minimal time the whole group needs to get over the minefield.

Input

The first line contains the integer n (2 ≤ n ≤ 100). The i-th of the following n lines specifies the time the i-th member of the group needs to get over the minefield (the time is an integer from 1 to 600).

Output

Output the minimal total time the group needs to cross the minefield.

Sample

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;
}


URAL 1826. Minefield(数学啊 递归)

原文:http://blog.csdn.net/u012860063/article/details/44279717

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!