一只小蜜蜂
有一只经过训练的蜜蜂只能爬向右侧相邻的蜂房,不能反向爬行。请编程计算蜜蜂从蜂房a爬到蜂房b的可能路线数。
其中,蜂房的结构如下所示。
Input输入数据的第一行是一个整数N,表示测试实例的个数,然后是N 行数据,每行包含两个整数a和b(0<a<b<50)。 其中,蜂房的结构如下所示。
Output对于每个测试实例,请输出蜜蜂从蜂房a爬到蜂房b的可能路线数,每个实例的输出占一行。
Sample Input
2 1 2 3 6Sample Output
1 3
解题思路
这道题和下面的E题还是挺像的,如果会写D题,那么就会写E题。问有几种方式可以到达目的地,以第二个样例为例,有多少种方法可以到达6处呢,因为它只能从左往右走,所以要想到达6处,有两种情况,从4到6和从5到6,那么是不是就可以这样想:有了到达5的路线条数和到达4的路线条数,两者之和就是到达6的路线条数。从5到达6只有一种方式,从4到达6虽有两种方式,但其中一种已经在到达5里面了,所以只要求出来到达4和5的路线条数即可。那么仿照上述往前推,到达5可以跟据到达3和4求出。。。。就可以得出一个规律:f(x)=f(x-1)+f(x-2),一眼看出前两项来,答案就出来了。简直是perfect!!!but我自己想也想不出来啊。哈哈哈哈哈哈(小菜偷偷溜走e...)
代码
#include <stdio.h> #include <algorithm> #include <math.h> #include <set> #include <queue> #include <stack> #include <map> #include <string.h> #include <iostream> #include <vector> using namespace std; int n; int main() { long long arr[55]; arr[1]=0; arr[2]=1; arr[3]=2; for(int i=4;i<50;i++) arr[i]=arr[i-1]+arr[i-2]; int a,b; cin>>n; while(n--) { cin>>a>>b; cout<<arr[b-a+1]<<endl; } return 0; }