URAL1826 Minefield(简单递归)
2015-03-15 17:28
302 查看
Minefield
[b]Description
[/b]
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
[b]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).
[/b]
[b]Output
[/b]
Output
the minimal total time the group needs to cross the minefield.
Sample Input
题意:一队士兵要经过敌人的雷区,因为探测仪只有一个,所以每次都是2个过去,然后一个人回来,路上所花费的时间都计较大的那个数,问所有人通过需要的最短时间。
思路:首先把所有人所需要花费的时间从小到大排列,要使总花费的时间比较少,那么我们有两种最优走法:
1.最小的和第二小的先过去,最小的回来带最大的过去,然后带第二大的过去……
2.最小的和第二小的先过去,最小的回来,最大的和第二大的过去,然后第二小的回来……
当n>=3的时候我们只要每次比较一下这两种走法那种更省时即可,就是一个简单的递归。
代码如下:
[b]Description
[/b]
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
[b]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).
[/b]
[b]Output
[/b]
Output
the minimal total time the group needs to cross the minefield.
Sample Input
input | output |
---|---|
4 1 10 5 2 | 17 |
思路:首先把所有人所需要花费的时间从小到大排列,要使总花费的时间比较少,那么我们有两种最优走法:
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; }
相关文章推荐
- URAL 1826 Minefield
- URAL - 1826 Minefield
- SQL2000 存储过程中实现递归的一个简单例子
- 递归的简单解释
- (课本习题)一个简单的用递归解决的小程序
- 递归经典简单问题之猴子吃桃
- 用栈和递归求解两顶点的所有简单路径
- linux下压缩与解压缩的简单记忆方法;递归删除文件夹
- (课本习题)一个简单的用递归解决的小程序
- linux下递归删除文件夹,简单实现rm的功能
- 初学者看过来:简单谈谈 C/C++ 递归的思想,实现,以及和循环的关系。
- 最简单的递归遍历CTreeCtrl树C++代码
- 递归的简单解释
- demo : 简单的 xslt 递归解析 xml 成 tree
- 递归的简单例子 3n+1问题
- 简单的递归程序,怎么考试的时候我就糊涂了呢?
- 4.5.1简单递归消除
- 简单二叉树的创建和输出(递归)
- 递归简单实例
- 用递归实现简单的tree