小记:真是坑的题目,我以为会有1-999999这样的数据。我用数组标记,每个循环过的数我就记下它的循环次数。下次碰到就直接输出。尼玛爆了RE。用暴力还直接AC了。


思路:暴力吧。我这个RE,大神们帮忙看看。。。

RE的:

#include <iostream>
#include <cstdio>
#include <map>
#include <cstring>
using namespace std;

const int MAX_ = 3000010;

long long d[MAX_];

long long dfs(int x){
    if(d[x])return d[x];
    if(x == 1)return d[x] = 1;
    if(x%2){
        return d[x] = dfs(3*x + 1) + 1;
    }
    else {
        return d[x] = dfs(x/2) + 1;
    }
}

int main(){
    //freopen("f:\\out.txt","w",stdout);
    long long n,m, ans, T;

    while(cin>>n>>m){
        cout<<n<<" "<<m;
        if(n > m)swap(n,m);
        memset(d,0,sizeof(d));
        ans = -1;
        for(int i = n; i <= m; ++i){
            if(!d[i]){
                d[i] = dfs(i);
            }
            if(ans < d[i])ans = d[i];
        }
        cout<<" "<<ans<<endl;
    }

    return 0;
}


暴力的:

#include <iostream>
#include <cstdio>
#include <map>
#include <cstring>
using namespace std;

int df(int x,int n){
    if(x == 1)return n;
    x = (x%2!=0)?(3*x+1):(x/2);
    return df(x,n+1);
}

int main(){
    //freopen("f:\\out.txt","w",stdout);
    long long n,m, ans, T;

    while(cin>>n>>m){
        cout<<n<<" "<<m;
        if(n > m)swap(n,m);
        ans = -1;
        for(int i = n; i <= m; ++i){
            T = df(i,1);
            if(ans < T)ans = T;
        }
        cout<<" "<<ans<<endl;
    }

    return 0;
}