分巧克力 - 湖北民族学院提供--【英雄会之高校俱乐部】

经常去英雄会逛逛倒是不假,但是很少去高校俱乐部,因为这两边的题目有部分相同,hero那边难度可能稍微高一点,不过今天倒是逛了一下,被一个一星的来了个当头一棒...
题目很简单:

儿童节快到了,班长想要给班上的每个同学给一个巧克力,巧克力的形状是一个宽为2,长为n的长方形,由于巧克力太贵,班长就想把这个大块的巧克力分成许多1*2(宽*长)的小块巧克力,这样每个人都能得到一份1*2的巧克力,现在给定巧克力的长为正整数n(1<=n<=91),请你判断对于这 个2*n的巧克力有多少种不同的分法?

 
相信很多人第一眼看到这个题目就知道了,这是一个典型的斐波那契数列的问题,这个题目在一次学校的竞赛上遇到到,当时这题侥幸也过了...


不多言,说一下错误的经历吧,首先是关于n <= 91的问题,刚才急着提交,可是看自己不是用递归做的,故而没考虑其它;

这时,第一个问题出现了,数据的超限问题,因为int型数据无法表示出这个结果,总之,粗心导致了这个问题;

由于在c语言中苦改无果,因为代码中给的是printf("%ld",pre(0));对于long long型数据而已,应该是"%lld",这是后话,当时没发现,我改换阵营至c++了,对于cout就没这些问题了,提交...依然是错误,但是依然不给测试点...
就这样慢慢调试,发现了一个问题,x < 4的皆不听使唤,结果是个空的(后来移至自己的codeblocks编译器则没问题,说明咱们hero的还是比较严格的);

这时候发现是内存的问题:

    long long *dp = (long long *)malloc(( x + 1 ) * sizeof(long long));
    dp[0] = 0;  //没有巧克力
    dp[1] = 1;  //1*2只有一块
    dp[2] = 2;  //2*2可分为两次
    dp[3] = dp[1] + dp[2];  //2*3
表面上看这一段没有问题,可是x < 3的话,上面的代码总会有一些本来未开辟的内存在被使用,故而出现问题,经过修改(最后移至c);

#include<stdio.h>
#include <stdlib.h>

long long pre (int x)
{
    long long *dp = (long long *)malloc(( x + 1 ) * sizeof(long long));
    int i;
    if(x <= 3)
        return x;
    else
    {
        dp[0] = 0;  //没有巧克力
        dp[1] = 1;  //1*2只有一块
        dp[2] = 2;  //2*2可分为两次
        dp[3] = dp[1] + dp[2];  //2*3
    
        for (i = 4; i <= x ; i++)
        {
            dp[i] = dp[i - 1] + dp[i - 2];
        }
        return dp[x];
    }
    
}
//start 提示:自动阅卷起始唯一标识,请勿删除或增加。
int main()
{    
    printf("%lld",pre(2));
}
//end //提示:自动阅卷结束唯一标识,请勿删除或增加。  
这些就是平时的一些细节,希望自己能够多多改正;

回到家里一直感觉博客的编辑器没之前好用,不知道是不是家里的电脑的问题,这些文字的格式乱的很...不知道有没有同道有相同的赶脚...

(*∩_∩*)


分巧克力 - 湖北民族学院提供--【英雄会之高校俱乐部】

上一篇:Qunee for HTML5 v1.3新版本发布


下一篇:题目1201:二叉排序树