Skip to content

Conversation

@oncsr
Copy link
Contributor

@oncsr oncsr commented Feb 26, 2025

🧷 문제 링크

https://www.acmicpc.net/problem/17613

🧭 풀이 시간

85분

👀 체감 난이도

✏️ 문제 설명

  • 수직선 위의 0에서 출발해서 오른쪽으로 점프들을 수행한 후 목표 수 x에 도착하려 한다.
  • 점프 간격은 처음에 1이고, 다음부터는 직전 점프 간격의 두 배로 증가해야 한다.
  • 만약 목표 수 x를 지나칠 것 같으면, 점프 간격을 1로 초기화할 수 있다.
  • 0에서 출발해서 x에 도달하기 위한 최소 점프 횟수를 $J(x)$라고 한다.
  • $x, y$가 주어지면, $\max(J(x), \cdots, J(y))$를 구해보자.

🔍 풀이 방법

[사용한 알고리즘]

  • 분할 정복
  • 그리디 알고리즘

  • 우선, $J(2^k - 1) = k$이고, $J(2^k-2) = 2k-2$이다.
  • 그 외의 경우에는, 항상 최대 점프를 한 번 해야한다. (목표 수를 넘지 않는 선에서 가능한 최대 간격까지 한 번 찍기)
    (증명이 너무 길어서 문제 풀며 쓴 메모장 첨부)
    -> $J(x) = J(2^{\lfloor \log_2{x} \rfloor} - 1) + J(x - (2^{\lfloor \log_2{x} \rfloor} - 1))$ 이다.

image

  • 이 관찰에서 더 나아가서, 각 수마다 깊이라는 개념을 추가할 수 있다. (깊이 = $\lfloor \log_2{x} \rfloor$)
  • 깊이 k인 수 전체에서의 최댓값을 D[k]라고 하면, D[k] = D[k-1] + k 라는 식이 성립한다.
  • 구간 [x, y]에서의 정답을 ans(x, y)라고 하고, 깊이 k에 존재하는 s번째 수부터 e번째 수까지 중에서의 정답을 sol(k, s, e)라고 정의한다.
  • ans(x, y)를 구할 때는, 깊이 별로 최댓값을 배열 D에서 참조하고 깊이의 부분 최댓값을 sol로부터 참조해서 구할 수 있다.
  • sol(k, s, e)를 구할 때는, 점프 횟수 구하는 식에 의해 k + ans(s, e)로 구할 수 있다.

⏳ 회고

  • sol함수를 짤 때 예외 케이스 처리 부분에서 return을 빼먹어서 틀렸다.

@ShinHeeEul ShinHeeEul merged commit c5bec3e into main Feb 26, 2025
1 check passed
@oncsr oncsr added the success 👍 해설을 보지 않고 풀었을 때 label Feb 26, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

success 👍 해설을 보지 않고 풀었을 때

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants