프로그래밍 챌린지 책을 보면서 새롭게 시작한 문제제공 및 Judge 서비스 해주는 곳이다. ACM ICPC와 매우 연관깊은 곳이기도 하다.
이 문제는 TLE에 유의해야한다.
힌트를 주자면 Memory cashing으로 Time, Space Trade-off하면 굉장히 빠른 시간에 답을 도출할 수 있다.
책을 자세히 읽어보지않아서 인풋을 while(scanf(...)==2) 이런식으로 받아야 하는 것을 몰라 한참 고민했다 ㅠㅠ..
- 주의 -
Recursion으로 구현했는데 FunctionCall StackOverFlow발생 :( ...
64bit integer 필요.
메모는 100만개짜리 int 배열.
while(scanf("%d %d",&a, &b)==2)
{
int maxlen=0;
int newA=a, newB=b;
if(newA>newB) {newA=newA^newB; newB=newA^newB; newA=newA^newB;} // a,b swap
for(int i=newA; i<=newB; i++)
{
cnt=1;
int tmp;
if( memo[i]==0)
memo[i] = cycle_lenth(i);
tmp = memo[i];
if( tmp>maxlen) maxlen = tmp; // maxlen 갱신
}
printf("%d %d %d\n", a, b, maxlen);
}
int cycle_lenth(long long int n)
{
long long int original = n;
while(n!=1)
{
if(n<1000000)
if(memo[n]!=0 )
{
cnt += (memo[n]-1);
// memo[original] = cnt;
break;
}
if( n%2 ==0) //짝수
{
n /= 2;
cnt++;
}
else //홀수
{
n = 3*n+1;
cnt++;
}
}
return cnt;
}
댓글 없음:
댓글 쓰기