题目
运行时间限制: 2sec
内存限制: 1024MB
题目
有一个N段的阶梯。小明现在处于第楼梯的起始处(第0段)。小明有两种选择,往上爬一格,或者往上爬两格。
但是,a1,a2,a3,....,am段的地方坏掉了,脚踏在这些地方是非常危险的。
在不踏入这些坏掉的地方的前提下,到达阶梯的最顶部(第N段),有多少种移动方法?结果需要总数和1,000,000,007取余的结果。
要求
- 1<=N<=100000
- 0<=M<=N-1
- 1<=a1<a2<...<am<=N-1
输入
输入都以以下标准从命令行输入
N M
a1
a2
.
.
.
aM
输出
输出满足条件的总数,与 1,000,000,007取余运算的结果
例1
输入
6 1
3
输出
4
移动方法有下面四种
- 0→1→2→4→5→6
- 0→1→2→4→6
- 0→2→4→5→6
- 0→2→4→6
例2
输入
10 2
4
5
输出
0
例3
输入
100 5
1
23
45
67
89
输出
608200469
记得最后的结果是总数与1,000,000,007取余
解题思路
读懂题目
1.有一个梯子,上面有些地方坏掉了,不能踩,从最开始的地方,往上踏一步,或者踏两步,看看有多少种爬法可以登顶
看着像是小学或者初中数学竞赛的题目,考察的是数列堆加的用法
解题思路
和前面两个格子的关系
如上图,到第2个格子的爬格子的方式有两种,
分别是
从0到2
从0到1,从1到2
再细想一想
其实就是
到第0个格子的方式的数量+到第1个格子的方式的数量
如果要求到最顶层第6层的爬格子的数量的话,那么只需要求出
爬到第4个格子的爬格子的方式
爬到第5个格子的爬格子的方式
在做相加就行了
那么公式就是steps[i] = steps[i-1] + steps[i-2]
特殊情況
- i=0的时候,最开始的位置,必定到达,且到达方法只有1种
- i=1的时候,如果第1个阶梯没有坏掉的话,那么到达方法为steps[0]+1
- i为坏掉的阶梯的时候,这时候steps[i]= 0
代码
def calculate(n, bindexes):
arr = []
for i in range(n):
if bindexes.get(i):
arr.append(0)
continue
if i == 0:
arr.append(1)
elif i == 1:
arr.append(arr[i-1] + 1)
else:
arr.append(arr[i-1] + arr[i-2])
return arr
S = input().split(" ")
n = int(S[0])
m = int(S[1])
brokenStairIndexes = {}
for i in range(m):
brokenStairIndexes.setdefault(int(input())-1, True)
arr = calculate(n,brokenStairIndexes)
print(arr[n-1] % 1000000007)
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。