首页 > 代码库 > POJ 1207 The 3n + 1 problem
POJ 1207 The 3n + 1 problem
水题,直接筛一下就好。不过需要注意输出。
自己学校的渣OJ 的数据范围才叫大:All integers will be less than 10,000,000 and greater than 0.
跑了1.7ms。时限2ms。
POJ这道题数据范围是:All integers will be less than 10,000 and greater than 0.
直接所有的删掉2个0。直接就0ms了。
#include<cstdio> #include<cstring> #include<algorithm> #include<queue> using namespace std; bool v[100001]; int a[100001]; queue<int>q; int bfs() { memset(v,0,sizeof(v)); memset(a,0,sizeof(a)); q.push(1);v[1]=1,a[1]=1; while(1) { int i,tmp,ans; bool ok=0; while(!q.empty()) { tmp=q.front(),q.pop(); if((tmp-1)%3==0&&tmp>1&&((tmp-1)/3)&1) { ans=(tmp-1)/3; if(!v[ans]&&ans<100001) v[ans]=1,a[ans]=a[tmp]+1,q.push(ans),ok=1; } ans=tmp*2; if(!v[ans]&&ans<100001) v[ans]=1,a[ans]=a[tmp]+1,q.push(ans),ok=1; } if(!ok)break; } long long i,ans,tmp; for(i=1;i<100001;i++) { if(!v[i]) { tmp=i;ans=0; while(1) { if(tmp&1) tmp=3*tmp+1,ans++; else tmp/=2,ans++; if(tmp<100001&&a[tmp]!=0)break; } a[i]=a[tmp]+ans; v[i]=1; } } } int main() { int a1,a2,i,tmp; bfs(); while(~scanf("%d%d",&a1,&a2)) { bool ok=0; if(a1>a2)ok=1; tmp=max(a1,a2); a1=min(a1,a2),a2=tmp; tmp=0; for(i=a1;i<=a2;i++) tmp=max(tmp,a[i]); if(!ok) printf("%d %d %d\n",a1,a2,tmp); else printf("%d %d %d\n",a2,a1,tmp); } }
POJ 1207 The 3n + 1 problem
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。