URAL1826 Minefield(简单递归)

                                                               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

input output
4
1
10
5
2
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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值