URAL1826 Minefield(简单递归)

来源:互联网 发布:网络销售法律法规 编辑:程序博客网 时间:2024/05/29 18:12

                                                               Minefield

Description

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

inputoutput

411052
17

题意:一队士兵要经过敌人的雷区,因为探测仪只有一个,所以每次都是2个过去,然后一个人回来,路上所花费的时间都计较大的那个数,问所有人通过需要的最短时间。

思路:首先把所有人所需要花费的时间从小到大排列,要使总花费的时间比较少,那么我们有两种最优走法:

1.最小的和第二小的先过去,最小的回来带最大的过去,然后带第二大的过去……

2.最小的和第二小的先过去,最小的回来,最大的和第二大的过去,然后第二小的回来……

当n>=3的时候我们只要每次比较一下这两种走法那种更省时即可,就是一个简单的递归。

代码如下:

#include <stdio.h>#include <string.h>#include <iostream>#include <algorithm>using namespace std;int spd[105];int n,time;void f(int num){if(num==1)          time+=spd[1];      else if(num==2)          time+=spd[2];      else if(num==3)          time+=spd[1]+spd[2]+spd[3];      else      {          time+=min(2*spd[1]+spd[num-1]+spd[num], 2*spd[2]+spd[1]+spd[num]);          f(num-2);      }  }int main(){while(scanf("%d",&n)!=EOF){time=0;for(int i=1; i<=n; i++){scanf("%d", &spd[i]);}sort(spd+1, spd+n+1);f(n);printf("%d\n", time);}return 0;}


0 0
原创粉丝点击