算法提高 超级玛丽

来源:互联网 发布:传奇一条龙源码 编辑:程序博客网 时间: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
原创粉丝点击