#19110: 請問一下


easylin0126@gmail.com (林榮翼)

學校 : 臺北市立成功高級中學
編號 : 89424
來源 : [140.114.207.162]
最後登入時間 :
2023-09-27 16:33:24
b936. Kevin 愛橘子 -- 有一天Kevin走在路上 | From: [106.105.1.190] | 發表日期 : 2019-08-31 12:46

範測的最後一組 201612 28 ,我的程式一直輸出0,不知道這樣遞迴哪裡錯了QQ,想請教大大們!

#include<stdio.h>
#include<unordered_map>
using namespace std;
long long n,m;
unordered_map<long long,long long> map;//用哈希表把答案記錄下來
long long f(long long num){
    if(map.count(num))
        return map[num];
    if(num==m)
        return map[num]=1;
    if(num<m)
        return map[num]=0;
    if(num&1)
        return map[num]=f((num+1)>>1)+f((num-1)>>1);
    else
        return map[num]=(f(num>>1)<<1);
}
int main(){
    while(~scanf("%lld%lld",&n,&m)) {
        printf("%lld\n",f(n));
        map.clear();
    }
}

 
#19113: Re:請問一下


inversion (「我們所認識的可符香是個像天使的好女孩」之葉林 *Cries...)

學校 : 國立清華大學
編號 : 43537
來源 : [49.159.6.107]
最後登入時間 :
2022-05-28 19:29:12
b936. Kevin 愛橘子 -- 有一天Kevin走在路上 | From: [49.158.83.43] | 發表日期 : 2019-08-31 16:15

範測的最後一組 201612 28 ,我的程式一直輸出0,不知道這樣遞迴哪裡錯了QQ,想請教大大們!

#include
#include
using namespace std;
long long n,m;
unordered_map map;//用哈希表把答案記錄下來
long long f(long long num){
    if(map.count(num))
        return map[num];
    if(num==m)
        return map[num]=1;
    if(num<m)
        return map[num]=0;
    if(num&1)
        return map[num]=f((num+1)>>1)+f((num-1)>>1);
    else
        return map[num]=(f(num>>1)<<1);
}
int main(){
    while(~scanf("%lld%lld",&n,&m)) {
        printf("%lld\n",f(n));
        map.clear();
    }
}

給一個簡單的測資如下:

4 3

您的程式碼會給出 0 這個答案,但是應為 1 才對。

 

因為 n = 4 時,您的程式會將其分為兩個 2 並遞迴去求 n = 2 的狀況。

此時因為條件式 num < m ,所以會回傳一個 0 到上一層的遞迴堆疊。而 0 × 2 = 0 ,所以最終的回傳值為 0 。

而這當然是不正確的,因為如果 m ≦ num < 2 × m 即可知道這個數量的橘子片最多只能分給一個人,不用繼續剖開去求解。

因此,遞迴式之終止條件須作一些調整。

 

以上,希望有幫助到您。

 
#19114: Re:請問一下


easylin0126@gmail.com (林榮翼)

學校 : 臺北市立成功高級中學
編號 : 89424
來源 : [140.114.207.162]
最後登入時間 :
2023-09-27 16:33:24
b936. Kevin 愛橘子 -- 有一天Kevin走在路上 | From: [106.105.1.190] | 發表日期 : 2019-08-31 17:15

範測的最後一組 201612 28 ,我的程式一直輸出0,不知道這樣遞迴哪裡錯了QQ,想請教大大們!

#include
#include
using namespace std;
long long n,m;
unordered_map map;//用哈希表把答案記錄下來
long long f(long long num){
    if(map.count(num))
        return map[num];
    if(num==m)        return map[num]=1;
    if(num<m)
        return map[num]=0;
    if(num&1)
        return map[num]=f((num+1)>>1)+f((num-1)>>1);
    else
        return map[num]=(f(num>>1)<<1);
}
int main(){
    while(~scanf("%lld%lld",&n,&m)) {
        printf("%lld\n",f(n));
        map.clear();
    }
}

給一個簡單的測資如下:

4 3

您的程式碼會給出 0 這個答案,但是應為 1 才對。

 

因為 n = 4 時,您的程式會將其分為兩個 2 並遞迴去求 n = 2 的狀況。

此時因為條件式 num < m ,所以會回傳一個 0 到上一層的遞迴堆疊。而 0 × 2 = 0 ,所以最終的回傳值為 0 。

而這當然是不正確的,因為如果 m ≦ num < 2 × m 即可知道這個數量的橘子片最多只能分給一個人,不用繼續剖開去求解。

因此,遞迴式之終止條件須作一些調整。

 

以上,希望有幫助到您。

謝謝您!!原來是我誤解題意了><,一直以為題目要求的是剛好分成m片,再次感謝!!


 
ZeroJudge Forum