(本题取 $n=1000000$,规定 $\text{col}_n$ 为 $n$ 的序列长度)
【思路】直接 $\mathcal O(n \max {\text{col}_i})$ 求解:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| #include<stdio.h> int ans,maxn; int main() { for(int i=1;i<=1000000;++i) { int x=1; long long t=i; while(t!=1) { if(t&1)t=t*3+1; else t>>=1; ++x; } if(x>maxn) { ans=i; maxn=x; } } printf("%d",ans); return 0; }
|
【优化】采用记忆化减小常数:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
| #include<stdio.h> int ans,f[1000001]; int main() { for(int i=1;i<=1000000;++i) { if(!f[i]) { f[i]=1; long long t=i; int a[1001]={}; while(t!=1) { if(t&1)t=t*3+1; else t>>=1; ++f[i]; if(t<=1000000) { a[f[i]]=t; if(f[t]) { f[i]+=f[t]-1; break; } } } for(int j=2;j<=f[i];++j) { if(a[j]) { f[a[j]]=f[i]-j+1; } } } if(f[i]>f[ans])ans=i; } printf("%d",ans); return 0; }
|