直接模拟就可以。也可以在一定范围内记忆化。
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
using namespace std;
#define INF 0x3f3f3f3f
#define Maxn 100005
int num[Maxn];
int main()
{
#ifndef ONLINE_JUDGE
freopen("in.txt","r",stdin);
#endif
int p;
int m,n;
int ans;
int temp;
scanf(" %d",&p);
memset(num,0,sizeof(num));
while(p--)
{
scanf(" %d %d",&m,&n);
temp = n;
ans = n;
if(num[n] == 0)
{
while(n!=1)
{
if(n%2 == 0)
{
n/=2;
}
else
{
n = n*3 + 1;
}
ans = max(ans,n);
if(n<=100000 && num[n]!=0)
{
ans = max(ans,num[n]);
break;
}
}
ans = max(ans,n);
num[temp] = ans;
}
else
{
ans = num[temp];
}
printf("%d %d\n",m,ans);
}
return 0;
}