uva--100 - The 3n + 1 problem
2014-06-07 23:02
423 查看
这道题算得上是一道水题,因为算法题目已经给定了 ,主要的问题是数据量有点大,
还有就是要注意i j输入不一定是正序,需要自己调整一下,我就在这上面WA了一次.
我的思路:
开始的时候看到数据大到1000000,就想着能不能用空间换时间,
先把每个数的cycle len算出来,后面就只要直接调用就行了。
后面试了一下发现太费时间了,根本行不通,然后就直接就暴力过了。。。。。。。。
后面看了一下大神的思路,都讲可以把中间的结果保留下来,这样就可以减少很大一部分的
运算;后来我自己试了一下,发现时间效率提高了10倍(从0.659到0.056)这应该算的上是一种回溯的思想吧
代码如下:
还有就是要注意i j输入不一定是正序,需要自己调整一下,我就在这上面WA了一次.
我的思路:
开始的时候看到数据大到1000000,就想着能不能用空间换时间,
先把每个数的cycle len算出来,后面就只要直接调用就行了。
后面试了一下发现太费时间了,根本行不通,然后就直接就暴力过了。。。。。。。。
后面看了一下大神的思路,都讲可以把中间的结果保留下来,这样就可以减少很大一部分的
运算;后来我自己试了一下,发现时间效率提高了10倍(从0.659到0.056)这应该算的上是一种回溯的思想吧
代码如下:
//虽然不能直接将所有的值都算出来 //但保留一些中间值也是能极大地提高效率 #include<iostream> using namespace std; int a[1000000+10]; int visited[1000000+10]; int clen(int m) { int cnt=0; cnt++; while(m!=1) { if(m%2!=0) m=m*3+1; else m=m/2; cnt++; } return cnt; } int main() { int i1,j1; while(cin>>i1>>j1) { int i,j; if(i1>j1) { i=j1; j=i1; } else { i=i1; j=j1; } int max=0; for(int i2=i;i2<=j;i2++) { int m1; if(visited[i2]) //i2的cycle len值已经出现过了,直接用 m1=visited[i2]; else { m1=clen(i2); visited[i2] = m1;//记录出现了的i2的cycle len的值 } if(m1>max) max=m1; } cout<<i1<<" "<<j1<<" "<<max<<endl; } return 0; }
相关文章推荐
- UVa 100 - The 3n + 1 problem
- UVa 100 The 3n + 1 problem
- hdu 1032 && uva 100 The 3n + 1 problem
- UVA100 The 3n + 1 problem
- UVA100 POJ1207 HDU1032 The 3n + 1 problem【水题】
- UVa 100 The 3n + 1 problem
- UVA 100 - The 3n + 1 problem
- UVa 100 - The 3n + 1 problem
- UVa100:The 3n + 1 problem
- uva 100 The 3n + 1 problem
- UVa100 The 3n + 1 problem
- uva-100-The 3n + 1 problem
- UVa——100 - The 3n + 1 problem(打表)
- UVa 100 - The 3n + 1 problem(函数循环长度)
- UVa 100 - The 3n + 1 problem
- UVa100 - The 3n + 1 problem
- UVa 100 - The 3n + 1 problem
- UVa 100 - The 3n + 1 problem 水题
- UVA 100 The 3n + 1 problem
- UVa 100 - The 3n + 1 problem