今天太困了,陪她下象棋。。真,,,,,
/****************************************************************/
Description
Consider the following algorithm:
1. input n
2. print n
3. if n = 1 then STOP
4. if n is odd then n <- 3n + 1
5. else n <- n / 2
6. GOTO 2
Given the input 22, the following sequence of numbers will be printed 22 11 34 17 52 26 13 40 20 10 5 16 8 4 2 1
It is conjectured that the algorithm above will terminate (when a 1 is printed) for any integral input value. Despite the simplicity of the algorithm, it is unknown whether this conjecture is true. It has been verified, however, for all integers n such that 0 < n < 1,000,000 (and, in fact, for many more numbers than this.)
Given an input n, it is possible to determine the number of numbers printed (including the 1). For a given n this is called the cycle-length of n. In the example above, the cycle length of 22 is 16.
For any two numbers i and j you are to determine the maximum cycle length over all numbers between i and j.
Input
You should process all pairs of integers and for each pair determine the maximum cycle length over all integers between and including i and j.
You can assume that no opperation overflows a 32-bit integer.
Output
Sample Input
Sample Output
这题真的可以说是超级的水,我一开始想暴力过不了,简单点,要不就是优化的暴力,谁知道就是纯暴力也可以A,之前不A的原因是因为这一句“The integers i and j must appear in the output in the same order in which they appeared in the input”,就是说输入的i可能会大于j。最后还是按照原来的顺序输出。
方法就是int x=i,y=j,if(i>j)swap(i,j); ....最后printf("%d %d %d ",x,y,xxx);就OK了
不过通过这题我也复习了一下map的简单用法,首先头文件包含include<map> 然后map<数据类型1, 数据类型2>变量名 如map<int,int>my_Map,或者map<string.map>myMap
前者就是数组,第一个int是数组的下标,后一个int是数组里的数,后者就是用字符串当数组的下标,这种可能会用到。比如上次的hdu today那题。
总结就是第一个是下标,第二个是数值。 map刚申请好的时候没赋值,里面都是0,可以用my_Map.clear把里面的数字都清零。这点也是有些题目里比数组方便的地方。比如这题数组的话不一定申请的那么大的内存。用map就很好。不会超内存,用到那个才申请空间。map跟hash应该能很好的配合。不过我还没有实战过。
纯暴力代码(蠢的不能再蠢,但是可以过)
#include<math.h> #include<stdio.h> #include<string.h> #include<iostream> #include<algorithm> using namespace std; int n,i,j,cnt,ma; int main() { while(~scanf("%d%d",&i,&j)) { int x=i,y=j; if(i>j)swap(i,j); ma=cnt=1; for(n=i;n<=j;n++) { int m=n; cnt=1; while(m>1) { if(m&1) { m=m*3+1; cnt++; } else { m=m/2; cnt++; } } if(cnt>ma) { ma=cnt; } } printf("%d %d %d ",x,y,ma); } return 0; }
用map优化,算是hash吧,就是计算过的不重复计算
#include<queue> #include<map> #include<math.h> #include<stdio.h> #include<string.h> #include<iostream> #include<algorithm> using namespace std; map<int,int>my_Map; int n,i,j,ma,cnt; int main() { my_Map[1]=1; my_Map[2]=2; my_Map[4]=3; while(~scanf("%d%d",&i,&j)) { int x=i,y=j; if(i>j)swap(i,j); ma=cnt=0; for(int n=i;n<=j;n++) { int m=n; cnt=0; while(m>1) { if(my_Map[m]) { cnt=cnt+my_Map[m]; break; } else { if(m&1) { m=m*3+1; cnt++; } else { m=m/2; cnt++; } } } my_Map[n]=cnt; ma=max(cnt,ma); } printf("%d %d %d ",x,y,ma); } return 0; }
版权声明:本文为博主原创文章,未经博主允许不得转载。