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;
}
額,代碼還是沒有自己風格啊。這些個函數名還是那么難取呢。