传送门:戳我
题目大意:给定一个操作,对于任何一个数,进行这种操作会生成一个序列,这个序列的长度记为Cycle Length。求某个区间中最大的Cycle Length。
思路:一开始又想多了,感觉是一道数学味很浓的题……怕对于某些大数,它在变化的过程中会超int啊,Cycle Length太长了超时啊,区间太大了也超时啊,然后就没有想到什么好的办法……结果最后打了个表看了一下,简直想多了……
于是这个问题就变成了一个简单粗暴的模拟了。
Trick:输入数据中的区间不一定是左界小于右界,所以需要手动换一下……然后输出中,他又叫你直接把区间输出来,所以你又要输出之前给的区间
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
int ll,rr;
int main(){
while (scanf("%d%d",&ll,&rr)!=EOF){
int l,r;
if (ll>rr){
l=rr;
r=ll;
}
else {
l=ll;
r=rr;
}
long long max=0;
for (int i=l;i<=r;i++){
long long n=i,cy=1;
while (n!=1){
if (n % 2 ==1) n=n*3+1;
else n=n>>1;
cy++;
}
if (cy>max) max=cy;
}
printf("%d %d %d\n",ll,rr,max);
}
return 0;
}