#31740: 求 RE, TLE 原因?


jason096727@gmail.com (Jason Ho)

學校 : 高雄市苓雅區福東國民小學
編號 : 189939
來源 : [150.116.71.76]
最後登入時間 :
2023-07-15 21:32:51
b936. Kevin 愛橘子 -- 有一天Kevin走在路上 | From: [150.116.71.227] | 發表日期 : 2022-08-17 12:30

#include <bits/stdc++.h>

using namespace std;

long long cnt, m;

long long dfs(long long n){
    if (n/2<m || n-n/2<m){
        cnt++;
        return cnt;
    }
    dfs(n/2);
    dfs(n-n/2);
    return cnt;
}

int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    long long n;
    while (cin >> n >> m){
        cnt = 0;
        if (n < m){
            cout << '0' << '\n';
        }
        else {
            cout << dfs(n) << '\n';
        }
    }
    return 0;
}

 
#31741: Re: 求 RE, TLE 原因?


krameri120 (科科)

學校 : 國立臺南高級工業職業學校
編號 : 102318
來源 : [36.237.212.239]
最後登入時間 :
2024-04-01 14:20:14
b936. Kevin 愛橘子 -- 有一天Kevin走在路上 | From: [27.52.30.54] | 發表日期 : 2022-08-17 14:15

遞迴慢,堆疊太多層

 
#31742: Re: 求 RE, TLE 原因?


krameri120 (科科)

學校 : 國立臺南高級工業職業學校
編號 : 102318
來源 : [36.237.212.239]
最後登入時間 :
2024-04-01 14:20:14
b936. Kevin 愛橘子 -- 有一天Kevin走在路上 | From: [27.52.30.54] | 發表日期 : 2022-08-17 14:23

遞迴慢,堆疊太多層


假設n=10,m=3
第一層會是n=10
第二層會是n=5 cnt+1
return
接續第一層,第二層會是10-10/2 cnt+1
return
才結束,這樣的code會因為n>>m的時候
導致stack overflow

 
#31743: Re: 求 RE, TLE 原因?


krameri120 (科科)

學校 : 國立臺南高級工業職業學校
編號 : 102318
來源 : [36.237.212.239]
最後登入時間 :
2024-04-01 14:20:14
b936. Kevin 愛橘子 -- 有一天Kevin走在路上 | From: [27.52.30.54] | 發表日期 : 2022-08-17 14:39

可以用位元運算子會比較快
N/2 - >  N>>1右移
例如000101=(5)
右移1就等於000010(2)
N%2==1 -> N&1
例如000101=(5)
就會是
   000101
&000001
-----------
   000001
等於1

 
#31775: Re: 求 RE, TLE 原因?


jason096727@gmail.com (Jason Ho)

學校 : 高雄市苓雅區福東國民小學
編號 : 189939
來源 : [150.116.71.76]
最後登入時間 :
2023-07-15 21:32:51
b936. Kevin 愛橘子 -- 有一天Kevin走在路上 | From: [150.116.71.227] | 發表日期 : 2022-08-18 19:55

可以用位元運算子會比較快
N/2 - >  N>>1右移
例如000101=(5)
右移1就等於000010(2)
N%2==1 -> N&1
例如000101=(5)
就會是
   000101
&000001
-----------
   000001
等於1

照你的改完再換成 scanf printf 就過了😁

 
ZeroJudge Forum