-
[1011] Fly me to the Alpha CentauriBOJ 2021. 11. 12. 11:08
https://www.acmicpc.net/problem/1011
1011번: Fly me to the Alpha Centauri
우현이는 어린 시절, 지구 외의 다른 행성에서도 인류들이 살아갈 수 있는 미래가 오리라 믿었다. 그리고 그가 지구라는 세상에 발을 내려 놓은 지 23년이 지난 지금, 세계 최연소 ASNA 우주 비행
www.acmicpc.net
<문제>
풀이를 이끌어내는데에 필요한 결정적인 관찰중 하나는, 제곱수에 관한 것이다.
1, 4, 9, 16...같은 제곱수는 아래와 같은 형식으로 딱 떨어진다.
1
1-2-1
1-2-3-2-1
1-2-3-4-3-2-1움직여야 하는 거리, 곧 문제에서 주어지는 (y-x)를 len이라고 하자.
len이 16이라면 최대 이동속도는 4이므로, (4-1)*2+1, 곧 7을 답으로 구할 수 있다.
최대 이동속도는 정가운데에 존재하고, 정가운데를 기준으로 양옆에 1...maxSpeed-1개의 숫자가 있을테니
len이 제곱수라면 sqrt(len)으로 maxSpeed를 구한 뒤, 2*(maxSpeed-1)+1을 출력하면 된다.
문제는 [17, 24]같은 제곱수 사이에 존재하는 대부분의 경우를 어떻게 처리하느냐인데...
"1-2-3-4-3-2-1"에 숫자를 끼워넣는다고 생각해보자.
물론 이경우 maxSpeed가 4이므로, 4를 초과하는 숫자를 넣을수 없으며
음수와 0을 끼워넣는 경우는 최적해를 보장할 수 없으므로,
[1, maxSpeed]사이의 수를 끼워넣는다고 생각하면 되겠다.
2를 끼워넣으면 "1-2-3-4-3-2-2-1"이나 "1-2-2-3-4-3-2-1"처럼 2가지 경우의 수가 있고,
여기서 다시 2를 추가하는 경우도 다시 2가지가 그대로 유지된다.
결국 어떠한 방식으로든 [1, maxSpeed]사이의 수를 끼워넣는것은 항상 가능하며
최대한 적은 개수를 추가하기 위해 가장 큰 수부터 끼워넣는다면(그리디적 접근)
추가횟수 : (len - (maxSpeed*maxSpeed)) / maxSpeed의 식이 나오게 된다.
len : 공간이동 장치가 움직여야하는 총 거리
maxSpeed : 공간이동장치가 움직일때의 최고속력
ans : 최소 이동횟수
<소스코드>
123456789101112131415161718#include <bits/stdc++.h>using namespace std;int t;int main(void) {cin >> t;while (t--) {int x, y;cin >> x >> y;int len = y - x;int maxSpeed = sqrt(len) + 1e-3;int ans = 2 * (maxSpeed - 1) + 1;int cur = maxSpeed * maxSpeed;int left = len - cur;ans += (int)(ceil((double)left / (double)maxSpeed));cout << ans << '\n';}return 0;}cs 'BOJ' 카테고리의 다른 글
[2138] 전구와 스위치 (0) 2021.11.16 [3190] 뱀 (0) 2021.11.13 [1182] 부분수열의 합 (0) 2021.11.10 [17503] 맥주 축제 (0) 2021.11.10 [13975] 파일 합치기 3 (0) 2021.11.09