POJ_1207

来源:互联网 发布:华腾软件系统 编辑:程序博客网 时间:2024/05/21 16:56

 

题意:

对于一个数n进行操作:如果n为奇数:n=3n+1;如果n为偶数:n=n/2;

n=1时停止,由此可以得到n一共变化了多少次(包括初始的n和最后的1,比如题目中的当n=22时,长度是16)。现在给出一个区间[i,j],其中必有一个数按上面方法操作变化的次数最多,求这个数变化多少次(这个次数>=该区间所有数其他数变化的次数)。

 

 

思路:定义一个数组sum[],记录每个每个数变化的次数,然后比较得出最大的次数就是结果。不过这种方法太暴力了,虽然在给定的数据范围内也能够瞬秒,但还是可以优化的。注意题目:j的值不一定比i的大

 

优化思路:

对于n我们可以得到以下结论:

                                             n 为奇数:  3n+1变化次数肯定比n小(如果3n+1在区间内,滤去)

                                                   偶数:  n/2变化的次数肯定比n小(如果n/2在区间内,滤去)

至于上面的滤去方法,设置一个bool数组就可以了。

 

 

 

以下是代码: