기본 콘텐츠로 건너뛰기

2965 : 캥거루 세마리 (Dynamic Programming) [C,C++]

내가 푼 방식이 DP가 아니라면 사실 이 문제는 DP로 풀지 않아도 되는 문제이다.


나는 이렇게 생각했다.


최대 몇 번 움직일 수 있을까?


최대로 움직이려면 간격을 한 번에 크게 좁히기보다 조금씩 좁히는 것이 낫다.


주어진 조건 정수에서 가장 조금씩 좁히는 방법은?

1씩 움직이자!


그래서 왼쪽 캥거루, 가운데 캥거루, 오른쪽 캥거루의 위치만 변경시키기로 했다.


조건 3가지만 이용하여 반복문을 돌렸다.


조건 1) 왼쪽 격차가 더 크다면 가운데 캥거루의 위치를 왼쪽 캥거루의 위치 + 1로 이동시키고 오른쪽 캥거루는 가운데 캥거루의 위치로 이동시킨다.


조건 2) 오른쪽 격차가 더 크다면 가운데 캥거루의 위치를 오른쪽 캥거루의 위치 - 1로 이동시키고 왼쪽 캥거루는 가운데 캥거루의 위치로 이동시킨다.


조건 3) 각 캥거루의 위치가 1씩 차이난다면 반복문을 탈출한다.




bool Kangaroo::Jump()
{
 if ((this->Center - this->Left) >(this->Right - this->Center))
 {
  this->Right = this->Center;
  this->Center = this->Left + 1;
  this->Count++;
 }
 else if (((this->Center - this->Left) == 1) && ((this->Right - this->Center) == 1))
 {
  return false;
 }
 else
 {
  this->Left = this->Center;
  this->Center = this->Right - 1;
  this->Count++;
 }
 return true;
}



<소스 코드>


*Source of the problem = https://www.acmicpc.net/problem/2965
*문제 출처 : BAEKJOON ONLINE JUDGE


댓글

이 블로그의 인기 게시물

11401 : 이항계수 3 (Dynamic Programming, Divide and Conquer) [C++]

1번, 2번 문제들과 확연히 차이나는 입력의 범위. 400만 ! DP를 사용해서 풀 수 없는 문제이다 . 하지만 DP가 쓰이긴 한다! 수학은 너무 어렵다. 곱셈의 역원을 공부해보다가 모르겠어서 도움을 구했다. 왜 곱셈의 역원을 구해야하는가? N! / (K! * (N-K)!) 에서 K! * (N-K)! 의 역원을 구해야 하기 때문! 곱셈의 역원을 구하는 정리인 페르마의 소정리를 이용하면 p가 1000000007 이지만 분할 정복을 이용한 제곱 수 계산 덕분에 logP 시간 소요. 분할 정복을 이용한 제곱 수 계산은 계속 써먹을 것 같아서 따로 올려놓았다. DP가 쓰이는 부분은 구해준 400만의 역원을 바탕으로 모든 역원을 구하는 부분이다. 그러므로 총 시간 소요는 O(N+LogP) long long BinomialCoefficient :: GetNum ( int N , int K ) { this - > Factorial [ 1 ] = 1 ; for ( int i = 2 ; i < = 4000000 ; i + + ) this - > Factorial [ i ] = ( this - > Factorial [ i - 1 ] * i ) % P ; this - > Invert [ 4000000 ] = this - > Pow_DC ( this - > Factorial [ 4000000 ] , P - 2 ) ; for ( int i = 4000000 - 1 ; i > 0 ; i - - ) this - > Invert [ i ] = ( this - > Invert [ i + 1 ] * ( i + 1 ) ) % P ; if ( N = = K | | K = ...

1978 : 소수 찾기 [C++]

# include < iostream > # include < vector > using namespace std ; int main ( ) { cin . tie ( NULL ) ; vector < int > Primes ; Primes . push_back ( 2 ) ; Primes . push_back ( 3 ) ; for ( int i = 4 ; i < 1000 ; i + + ) { bool IsPrime = true ; if ( i % 2 = = 0 | | i % 3 = = 0 ) continue ; for ( int j = 4 ; j < i ; j + + ) { if ( i % j = = 0 ) { IsPrime = false ; break ; } } if ( IsPrime ) Primes . push_back ( i ) ; } int N , Count = 0 ; cin > > N ; for ( int i = 0 ; i < N ; i + + ) { int Input ; cin > > Input ; for ( int j = 0 ; j < Primes . size ( ) ; j + + ) if ( Input = = Primes [ j ] ) Count + + ; } cout < < Count < < " \n " ; return 0 ; }