算法提高 超级玛丽
来源:互联网 发布:传奇一条龙源码 编辑:程序博客网 时间:2024/05/23 22:47
算法提高 超级玛丽
时间限制:1.0s 内存限制:256.0MB
提交此题
问题描述
大家都知道”超级玛丽”是一个很善于跳跃的探险家,他的拿手好戏是跳跃,但它一次只能向前跳一步或两步。有一次,他要经过一条长为n的羊肠小道,小道中有m个陷阱,这些陷阱都位于整数位置,分别是a1,a2,….am,陷入其中则必死无疑。显然,如果有两个挨着的陷阱,则玛丽是无论如何也跳过不去的。
现在给出小道的长度n,陷阱的个数及位置。求出玛丽从位置1开始,有多少种跳跃方法能到达胜利的彼岸(到达位置n)。
输入格式
第一行为两个整数n,m
第二行为m个整数,表示陷阱的位置
输出格式
一个整数。表示玛丽跳到n的方案数
样例输入
4 1
2
样例输出
1
数据规模和约定
40>=n>=3,m>=1
n>m;
陷阱不会位于1及n上
此题本来很容易想到用递归来求解,但仔细考虑,发现有更快的方法。
例如 输入
13 4
5 7 9 19
首先
第一步,求 5这个位置之前的格子数,5-0-1=4;然后sum*=第四个斐波那契数,即3,此时sum=3;
第二步,求5到7之间的格子数,7-5-1=1;sum*=第一个斐波那契数,即1,此时sum=3;
第三步,求7到9之间的格子数,9-7-1=1;sum*=第一个斐波那契数,即1,此时sum=3;
第四步,此时输入19,19大于13,略过不处理,
最后,求最后的陷阱到末尾的格子数,13-9=4;然后sum*=第四个斐波那契数,即3,此时sum=9;
sum即为正解。
#include<iostream>using namespace std;int fei[20];int main(){ int n,m,num,step,sum=1; fei[0]=0; fei[1]=1; for (int i=2;i<20;i++)//求斐波那契数列 { fei[i]=fei[i-1]+fei[i-2]; } cin>>n>>m; step=0;//计算步数 for (int i=0;i<m;i++) { cin>>num; if (num>n)//如果num>n,不合实际 continue; sum*=fei[num-step-1]; step=num; } sum*=fei[n-step]; cout<<sum; return 0;}
数论很重要!!!
0 0
- 算法提高 超级玛丽
- 算法提高 超级玛丽
- 算法提高 超级玛丽
- 算法提高 超级玛丽
- 算法提高 超级玛丽
- 算法提高 超级玛丽
- 算法提高 超级玛丽
- 算法提高 超级玛丽
- 蓝桥网 算法提高 超级玛丽
- 蓝桥杯 算法提高 超级玛丽
- 蓝桥杯 ADV-165算法提高 超级玛丽(动态规划、递推)
- 超级玛丽
- 超级玛丽
- 超级玛丽
- 超级玛丽增强版
- 永远的超级玛丽
- 感谢支持超级玛丽
- MLDN的超级玛丽。。。
- Ajax上传文件
- javascript闭包
- 关于python安装环境的几个问题,mark一下
- 有哪些值得关注的技术博客(Java篇)
- Java概念性问题9
- 算法提高 超级玛丽
- POJ2100_Graveyard Design_尺取法::这样写更简洁
- LintCode 背包问题
- Linux学习-虚拟机安装Ubuntu
- eclipse的常用功能
- JavaScript中的对象(2)
- 将Servlet3.0版本的JavaWeb项目 回退到Servlet2.5版本
- 全球100个高质量Java开发者博客
- mevan pom.xml常见问题