这道题算得上是一道水题,因为算法题目已经给定了 ,主要的问题是数据量有点大,
还有就是要注意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;
}
本文介绍了一个涉及大量数据处理的算法问题及其解决方案。作者最初尝试通过预计算所有可能的循环长度来提高效率,但这种方法过于耗时。最终采用了记录并复用中间结果的方法,显著提升了程序运行速度。
533

被折叠的 条评论
为什么被折叠?



