青蛙过桥

题目出处

一座长度为n的桥,起点的一端坐标为0,且在整数坐标i处有a[i]个石头【0<=a[i]<=4】,一只青蛙从坐标0处开始起跳,一步可以跳的距离为1或2或3【即每一步都会落在整数点处】,青蛙落在i处会踩着该点的所有石头,求青蛙跳出这座桥最少踩多少个石头。并且输出依次跳过的坐标点路线,如果存在多种路线,输出字典序最小的那一条。

输入格式:

第一行整数n(<15000),接着下一行会有n+1个由空格隔开的整数,即桥上各个坐标处石头数量。

输出格式:

第一行为踩着最少石头个数,第二行为依次跳过的坐标点【字典数最小的】。

输入样例:

这里给出两组输入。例如:

10
1 2 1 3 0 3 1 2 1 1 2
100
1 2 0 4 0 1 3 4 2 2 1 3 1 4 0 3 0 1 2 3 3 2 2 0 1 0 0 0 0 1 2 1 3 4 0 3 4 4 1 0 4 1 3 1 1 2 3 4 4 4 0 2 0 1 1 1 3 1 3 2 1 2 4 1 2 1 4 1 0 0 1 2 3 0 2 4 4 0 0 4 2 0 2 1 3 3 0 0 2 0 0 1 2 4 2 2 2 4 0

输出样例:

在这里给出对应的输出。例如:

4
0 2 4 6 8
36
0 2 4 5 8 10 12 14 16 17 20 23 25 26 27 28 31 34 35 38 39 41 44 47 50 52 54 57 60 63 65 68 69 70 72 74 77 78 81 82 85 88 89 91 92 94 97 100

 1 package frog;
 2 import java.util.Scanner;
 3 //import java.lang.Math;
 4 import java.util.Stack;
 5 /**
 6  *
 7  * @author 刘金明  [email protected]
 8  * @see http://www.cnblogs.com/liujinming/
 9  *
10  */
11 public class Main {
12     private static int[] point;
13     private static int[] length;
14     private static int[] jump;
15     private static int start;
16 public static void main(String[] args){
17     Scanner sc=new Scanner(System.in);
18     int n=sc.nextInt();
19     start=sc.nextInt();
20     point=new int[n];length=new int[n];jump=new int[n];for(int i=0;i<length.length;i++) length[i]=-1;
21     for(int i=0;i<n;i++)point[i]=sc.nextInt();
22     recursion(n-1);
23     sc.close();
24     Stack<Integer> s=new Stack<Integer>();
25     //for(int i:length)System.out.print(i+" ");
26     for(int i=n-1;i>0;){
27         s.add(jump[i]+1);i=jump[i];
28     }
29     System.out.println(length[n-1]);
30     while(!s.isEmpty()){
31         System.out.print(s.pop()+" ");
32     }
33 }
34 /**
35  * 递归求解
36  */
37
38 private static int recursion(int a){
39     if(length[a]>=0);
40     else if(a<=2){
41         length[a]=start;
42         jump[a]=-1;
43     }
44     else if(point[a-3]<=point[a-1]&&point[a-3]<=point[a-2]){
45         jump[a]=a-3;
46         length[a]=recursion(a-3)+point[a-3];
47     }
48     else if(point[a-2]<=point[a-1]){
49         int x=recursion(a-3)+point[a-3];int y=recursion(a-2)+point[a-2];
50         if(x<y){
51             length[a]=x;jump[a]=a-3;
52         }
53         else
54         length[a]=y;jump[a]=a-2;
55     }
56     else{
57         int x=recursion(a-3)+point[a-3];int y=recursion(a-2)+point[a-2];int z=recursion(a-1)+point[a-1];
58         if(x<y&&x<z){
59             length[a]=x;jump[a]=a-3;
60         }
61         else if(y<z){
62             length[a]=y;jump[a]=a-2;
63         }
64         else
65             length[a]=z;jump[a]=a-1;
66     }
67
68         //length[a]=Math.min(recursion(a-3)+point[a-3],Math.min(recursion(a-2)+point[a-2], recursion(a-1)+point[a-1]));
69     return length[a];
70 }
71 }

实现代码

样例是我照着图输入进去的,貌似输漏了几个数,请以文首的链接处的图片为准

另外这并不是什么严谨的题目(看得到第一组输出里面最后一个数字不是终点10,而是终点的前一个位置,而第二组输出里面最后一个数字是终点100),我所求的也并不是字典数最小的答案,不过思路在这里了

时间: 2024-10-11 10:43:08

青蛙过桥的相关文章

南阳nyoj586疯牛 和nyoj619详解总结

这里先看nyoj619青蛙过桥,这样便于理解这两道题的共同点:最大值中的最小值, 题意:有一条河长L,中间有 n 块石头,青蛙最多可以跳 m 次,问题是:要保证青蛙能跳过去,那么它至少能一下跳多远,才能在m次范围内跳过去: 最大值中的最小值:这里要保证m次能跳过去,那么在这个过程中就会有很多种方法能在m次之内跳过去,那么,每一个方法中,我们就会有一个最大的跳跃距离! 比如:L=20,n=1:m=2:石头的位置是5 那么方法有:1.一次就跳过去,2.借助中间的石头,两次跳过去:那么在方法一中的最大

noip2005提高组题解

T1.谁拿了最多的奖学金 给出n个学生的信息,分别表示:姓名,期末成绩,班级评议成绩,是否学生干部(Y/N),是否西部学生(Y/N),论文数: 奖学金分为: 1).院士奖学金,每人8000 元,期末平均成绩高于80 分(>80),并且在本学期内发表1 篇或1 篇以上论文的学生均可获得: 2).五四奖学金,每人4000 元,期末平均成绩高于85 分(>85),并且班级评议成绩高于80 分 (>80)的学生均可获得: 3).成绩优秀奖,每人2000 元,期末平均成绩高于90 分(>90

恶意的转载:名词解释【蝴蝶效应】【青蛙效应】......

[蝴蝶效应] 蝴蝶效应:上个世纪70年代,美国一个名叫洛伦兹的气象学家在解释空气系统理论时说,亚马逊雨林一只蝴蝶翅膀偶尔振动,也许两周后就会引起美国得克萨斯州的一场龙卷风. 蝴蝶效应是说,初始条件十分微小的变化经过不断放大,对其未来状态会造成极其巨大的差别.有些小事可以糊涂,有些小事如经系统放大,则对一个组织.一个国家来说是很重要的,就不能糊涂. 今天的企业,其命运同样受“蝴蝶效应”的影响.消费者越来越相信感觉,所以品牌消费.购物环境.服务态度……这些无形的价值都会成为他们选择的因素.所以只要稍

vijos[1355]车队过桥问题

描述 现有N辆车要按顺序通过一个单向的小桥,由于小桥太窄,不能有两辆车并排通过.另外,由于小桥建造的时间已经很久,只能承受有限的重量,记为Max(吨).管理员将N辆车按初始的顺序分组,每次让一个组过桥,并且只有在一个组的车辆全部过桥后,下一组车辆才能上桥.每辆车的重量和最大速度是已知的,而每组车的过桥时间由该组中速度最慢的那辆车决定.请你帮管理员编一个程序,将这N辆车分组,使得全部车辆通过小桥的时间最短. 格式 输入格式 文件的第一行有3个数字,分别为Max(吨),Len(桥的长度,单位km),

经典算法一 --- 过桥问题

题目: 在漆黑的夜里,四位旅行者来到了一座狭窄而且没有护栏的桥边.如果不借助手电筒的话,大家是无论如何也不敢过桥去的.不幸的是,四个人一共只带了一只手电筒,而桥窄得只够让两个人同时通过.如果各自单独过桥的话,四人所需要的时间分别是1,2,5,8分钟:而如果两人同时过桥,所需要的时间就是走得比较慢的那个人单独行动时所需的时间.问题是,你如何设计一个方案,让用的时间最少. 针对上篇算法题--过桥问题的解析如下 解答其实也容易,能者多劳这四个字就足以形容解答方案了--用时短的人必须要多跑几趟以便传递手

过桥问题,求最短时间

小明一家5口人在夜晚过一座桥,小明过桥要1分钟,小明的弟弟过桥要3分钟,小明的爸爸过桥要6分钟,小明的妈妈过桥要8分钟,小明的爷爷过桥要12分钟:这座桥每次只能过2个人,因是夜晚,过桥时必须提着灯,小明有一只灯,点燃后30分钟会熄灭,问怎么样安排,才能保证小明一家在灯熄灭前过桥. 写了一个PHP程序解决这类问题.有问题,欢迎指出. <?php /* 过桥问题 */ main(); function main(){ $arr=array(3,1,12,8,6); print bridge($arr

【poj 1061】青蛙的约会(数论--同余方程 拓展欧几里德)

题意:已知2只青蛙的起始位置 a,b 和跳跃一次的距离 m,n,现在它们沿着一条长度为 l 的纬线(圈)向相同方向跳跃.问它们何时能相遇?(好有聊的青蛙 (??????‵) *)永不相遇就输出"Impossible".(蠢得可怜 -_-!) 解法:用拓展欧几里德求同余方程的最小正整数解.(a+mx)-(b+nx)=k*l (k表示圈数) → (m-n)x=k*l+b-a → (m-n)x=b-a(mod l).当然其实=(b-a)%l 更准确,但反正都是模,也没有关系啦.于是就像上题一

青蛙走迷宫问题(体力值)

题目: 青蛙走迷宫,1代表路通,0代表不通:起点是(0, 0),终点是(0,m - 1);青蛙每次向上走需要消耗体力值为3,向下走不消耗体力值,平走消耗体力值1:根据给定值判断青蛙是否可以根据初始值到达终点,并求出消耗体力值最少的路径: 举例: n = 4, m =4, p = 10(体力值) 4 4 10 1 0 0 1 1 1 0 1 0 1 1 1 0 0 1 1 则结果为:[[0, 0], [1, 0], [1, 1], [2, 1], [2, 2], [2, 3], [1, 3], [

动态规划--青蛙跳

Description 在河上有一座独木桥,一只青蛙想沿着独木桥从河的一侧跳到另一侧.在桥上有一些石子,青蛙很讨厌踩在这些石子上.由于桥的长度和青蛙一次跳过的距离都是正整数,我们可以把独木桥上青蛙可能到达的点看成数轴上的一串整点:0,1,……,L(其中L是桥的长度).坐标为0的点表示桥的起点,坐标为L的点表示桥的终点.青蛙从桥的起点开始,不停的向终点方向跳跃.一次跳跃的距离是s到t之间的任意正整数(包括s,t).当青蛙跳到或跳过坐标为L的点时,就算青蛙已经跳出了独木桥. 题目给出独木桥的长度L,