• HDU2044 一只小蜜蜂...


    问题链接HDU2044 一只小蜜蜂...基础训练题,用C语言编写程序。

    问题简述:参见上述链接。


    问题分析这个问题非常类似于HDU2041 超级楼梯,略微有些不同。

    站在第n个蜂房想一下,前一步是从哪里来的,问题就清楚了。

    看图可知,由于蜜蜂每次只能从前1个蜂房前2个蜂房过来,那么f(n)=f(n-2)+f(n-1)。这部就是一个菲波拉契数列吗?就是一个递推问题?

    可是,开始时候,蜜蜂是在第1个蜂房,所以数列的开始几项会有所不同。

    f(1)=0,因为蜜蜂开始在第1个蜂房;

    f(2)=1,蜜蜂只能从第1个蜂房来到第2个蜂房

    f(3)=2,蜜蜂可以从第1个蜂房过来,也可以第2个蜂房过来

    f(n)=f(n-2)+f(n-1),n>3。

    有了以上的递推式,一切几乎就解决了。

    还需要考虑的一点是,蜜蜂从a蜂房到b蜂房的各种可能路径,相当于从第1蜂房到第b-a+1蜂房。

    另外一点是,还是先打表吧,以防万一。

    程序说明:(略)。

    AC的C语言程序如下:

    /* HDU2044 一只小蜜蜂... */
    
    #include <stdio.h>
    
    #define MAXN 50
    
    typedef unsigned long long ULL;
    
    ULL fn[MAXN+1];
    
    void setfn()
    {
        int i;
    
        fn[0] = 0;
        fn[1] = 0;
        fn[2] = 1;
        fn[3] = 2;
        for(i=4; i<=MAXN; i++)
            fn[i] = fn[i-2] + fn[i-1];
    }
    
    int main(void)
    {
        int n, a, b;
    
        // 先打表(以防万一测试集合大)
        setfn();
    
        scanf("%d", &n);
        while(n--) {
            // 读入a和b
            scanf("%d%d", &a, &b);
    
            // 输出结果
            printf("%lld
    ", fn[b - a + 1]);
        }
    
        return 0;
    }


  • 相关阅读:
    [JSOI2016]最佳团体
    CF125E MST Company
    CF482C Game with Strings
    CF379F New Year Tree
    CF1051F The Shortest Statement
    小a和uim之大逃离
    新魔法药水
    翻硬币
    [CQOI2017]小Q的棋盘
    UVA11729突击战
  • 原文地址:https://www.cnblogs.com/tigerisland/p/7564645.html
Copyright © 2020-2023  润新知