经常去英雄会逛逛倒是不假,但是很少去高校俱乐部,因为这两边的题目有部分相同,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 //提示:自动阅卷结束唯一标识,请勿删除或增加。这些就是平时的一些细节,希望自己能够多多改正;
回到家里一直感觉博客的编辑器没之前好用,不知道是不是家里的电脑的问题,这些文字的格式乱的很...不知道有没有同道有相同的赶脚...
(*∩_∩*)