HDU 1032(3n+1问题)

来源:互联网 发布:java父类指向子类 编辑:程序博客网 时间:2024/06/18 00:42
#include <iostream>#include <vector>#include <algorithm>#include <cstdio>#define MAXN 1000000+10using namespace std;/*关键 : ①运算中间数过大用long long; ②可以先把所有数的对应函数值求出来(构造结果表)再让用户输入; ③由于创建表时是从小到大一个个数创建的, 因此比i小的元素的环数一定已经计算过了, 可以直接加上去(不走已走过的路径, 优化) ④看清题目对输入输出数字的顺序要求,  若需要则交换*/long long cnts[MAXN];long long maxcnt;int main(){int i,j;    long long x,cnt;    cnts[1] = 1;    for(long long i=2; i<MAXN; i++){    cnt = 0;    x = i;    while( 1 ){cnt++;if( x&1 ){x = (3*x+1);}else{x = x/2;}if( x<i ){cnt += cnts[x];break;}}cnts[i] = cnt;    }while( ~scanf("%d %d",&i,&j) ){    maxcnt = 0;    int a = i, b = j;     if( i>j ) swap(i,j);    for( int k=i; k<=j; k++){    maxcnt = max(cnts[k], maxcnt);    }   printf("%d %d %I64d\n",a,b,maxcnt);    }    return 0;}

0 0