https://www.acmicpc.net/problem/1011
시작점 x부터 도착점 y까지 이동하는 문제. 이동 횟수를 구해야 한다.
이동 속도는 1부터 시작하고, 한 번 이동할 때마다 ±1씩 증감한다.
마지막 지점에 들어오는 속도는 반드시 1이 되어야 한다는 조건이 있다.
즉, 속도는 1씩 증가하여 중간 지점에서 최대치에 도달한 후 서서히 감소하여 다시 1로 돌아온다.
규칙을 찾아보기 위해 표로 정리해 보았다.
두 지점 사이의 거리 | 최적의 속도 변화 |
1 | 1 |
2 | 11 |
3 | 111 |
4 | 121 |
5 | 1211 |
6 | 1221 |
7 | 11221 |
8 | 12221 |
9 | 12321 |
10 | 112321 |
11 | 122321 |
12 | 123321 |
... | ... |
1번 이동 : 1항부터
2번 이동 : 2항부터
3번 이동 : 3항부터
4번 이동 : 4항부터
5번 이동 : 7항부터
. . .
위 결과를 항으로 정리한다.
A1 = 1
A2 = 2 (1항에서 1 증가)
A3 = 3 (2항에서 1 증가)
A4 = 5 (3항에서 2 증가)
A5 = 7 (4항에서 2 증가)
A6 = 10 (5항에서 3 증가)
...
An+1 = An + | n/2 |
규칙만 알아낸다면 코드 작성은 간단하다.
#include <cstdio> int main() { int T; scanf("%d", &T); while (T--) { int x, y, ans = 1; unsigned int gap, pos = 1; scanf("%d %d", &x, &y); gap = y - x; // 두 지점 사이의 거리 for (int i = 2; pos < gap; i++) { pos += i / 2; // pos는 현재 위치이며 gap보다 작아야 한다. ans++; } if (pos > gap) ans--; printf("%d\n", ans); } return 0; }
'알고리즘' 카테고리의 다른 글
BOJ [1676] 팩토리얼 0의 갯수 (0) | 2017.08.10 |
---|---|
BOJ [1874] 스택 수열 (0) | 2017.08.10 |
BOJ [3344] N-Queen (0) | 2017.08.10 |
BOJ [1463] 1로 만들기 (0) | 2017.08.10 |
BOJ [6588, 9020] 골드바흐의 추측 (0) | 2017.08.10 |