문제 링크
풀이
규칙을 찾으면 되는 문제다.
어떤 거리만큼 가장 짧은 거리로 가려면 한 번에 많은 거리를 움직여야 한다. 한 번에 움직이는 거리가 최대가 되는 상황을 잘 구하면 된다.
만약 한번에 k만큼 움직인다면, k만큼 움직이기 위해서는 1 2 3 4 .. k k-1 k-2 .. 1 이런 식으로 움직여야 할 것이다.
이때 1 + 2 + 3 + 4 + .. + k + k-1 + k-2 + .. + 1는 k(k+1)/2 + k(k-1)/2로 k^2이 된다.
여기서 움직일 거리에서 가장 큰 k를 찾은 후에 남은 거리는 k k-1.. 1 만큼씩 남은 거리가 0이 될 때까지 최대한 큼직큼직하게 움직이면 된다.
코드
#include <cstdio>
using ll = long long;
void solve() {
int a, b; scanf("%d %d", &a, &b);
int d = b - a;
int k, ret;
for (k = 0; ll(k + 1) * (k + 1) <= (1LL << 32); k++) {
if (ll(k + 1) * (k + 1) > d) break;
}
ret = 2 * k - 1;
d -= k * k;
for (int i = k; i >= 1; i--) {
while (d >= i) {
d -= i;
ret++;
}
}
printf("%d\n", ret);
}
int main() {
int t; scanf("%d", &t);
while (t--) solve();
}
'Algorithm > BOJ' 카테고리의 다른 글
백준[2188] 축사 배정 (0) | 2021.11.13 |
---|---|
백준[2296] 건물짓기 (0) | 2021.11.13 |
백준[2631] 줄세우기 (0) | 2021.11.12 |
백준[16946] 벽 부수고 이동하기 4 (0) | 2021.11.12 |
백준[3830] 교수님은 기다리지 않는다 (0) | 2021.11.12 |