分巧克力 - 湖北民族學院提供--【英雄會之高校俱樂部】

經常去英雄會逛逛倒是不假,但是很少去高校俱樂部,因爲這兩邊的題目有部分相同,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 //提示:自動閱卷結束唯一標識,請勿刪除或增加。  
這些就是平時的一些細節,希望自己能夠多多改正;

回到家裏一直感覺博客的編輯器沒之前好用,不知道是不是家裏的電腦的問題,這些文字的格式亂的很...不知道有沒有同道有相同的趕腳...

(*∩_∩*)


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章