http://poj.org/problem?id=1207
3. if n = 1 then STOP
4. if n is odd then n <-- 3n+1
5. else n <-- n/2
问题很明白,之前在hdu上也做了,经验还是没有哇。WA了好多好多次。
1w的数据很弱,直接暴力当然能过。
不过100W就不行了。记忆化搜索DP是个好办法
我最之前的做法就是这个,效果还算不错。
求出所有的值后就是区间求最大值了,有RMQ算法,线段树等都行。不过,我都不会呀!!!!!!!!
朗讯的时候就做了个区间最值的问题,当时朴素算法一直WA,jh辉神 qsort()一下,从前往后给AC了。YMYM
最后还是就是细节问题了,像输出s,t。有可能s>t,输出却是要按照输入顺序输出!晕,就这样WA了一天。
总结:
细节问题要注意!多想想其他算法,水题不水呀。
#include<stdio.h>
#include<string.h>
#include<math.h>
long long a[10005];
int GetC()
{
int i,t;
for (i=1;i<=10000 ;i++ )
{
t=i;a[i]=1;
while (t!=1)
{
a[i]++;
if (t&1)
t=3*t+1;
else
t/=2;
}
}
}
int main()
{
int s,t,i;
long long mm;
GetC();
while (scanf("%d%d",&s,&t)==2)
{
printf("%d %d ",s,t);
if (s>t)
i=s,s=t,t=i;
mm=a[s];
for (i=s;i<=t ;i++ )
mm=mm>a[i]?mm:a[i];
printf("%I64d\n",mm);
}
return 0;
}
#include<stdio.h>
#include<string.h>
#include<math.h>
long long a[10005];
int GetC()
{
int i,t;
for (i=1;i<=10000 ;i++ )
{
t=i;a[i]=1;
while (t!=1)
{
a[i]++;
if (t&1)
t=3*t+1;
else
t/=2;
}
}
}
int main()
{
int s,t,i;
long long mm;
GetC();
while (scanf("%d%d",&s,&t)==2)
{
printf("%d %d ",s,t); //这个WA了一次
if (s>t) //这个WAl了好多次!!
i=s,s=t,t=i;
mm=a[s];
for (i=s;i<=t ;i++ )
mm=mm>a[i]?mm:a[i];
printf("%I64d\n",mm);
}
return 0;
}
额,代码还是没有自己风格啊。这些个函数名还是那么难取呢。