반응형
먼저 가장 확실한 것부터 처리하고 시작한다.
정상에 올라가기 전까지, 하루에 A-B 만큼 꾸준히 올라가는 그 시기를 먼저 계산한다.
(V-A)/(A-B) 를 계산한 몫이 하루동안 A-B 만큼 올라간 기간의 일수다.
days = (V - A) / (A - B) 라고 한다면, 이제 남은 거리는 V - days * (A - B) 만큼이 될 것이다.
left_distance = V - days * (A - B) 라고 하자.
여기서 두 가지의 경우로 나뉜다.
한 가지는 남은 거리가 A보다 작거나 같은 경우, 두번째는 남은 거리가 A보다 큰 경우.
첫번째 경우는 자명하게도 days 에서 하루만 더 추가해주면 된다.
(정상에 오른 후에는 미끄러지는 경우를 고려하지 않으므로)
두번째 경우, 남은 거리는 A보다 크지만 A + (A - B) 보다는 작을 수 밖에 없다.
왜냐하면 애초에 days 가 (V-A) 를 (A-B) 로 나눈 몫이기 때문에,
(V-A) 를 (A-B) 로 나눈 나머지 값에 비례하는 남은 거리는 하루만에 해결이 가능하다.
그리고 나서 또 남은 거리는 A보다 작을 수 밖에 없으니 또 하루를 추가해줘서
총 2일을 추가하면 해결이 된다.
쉽게 말해서 두번째 경우는 남은 거리가 A + 0.xx * (A - B) 꼴인 것이다.
따라서 (A - B) 만큼 올라가줌으로써 days 에 하루 추가, 남은 거리는 A - 0.xx (A - B) 꼴.
낮 동안 A - 0.xx (A - B) 만큼 올라가서 정상 도달. 또 하루 추가. 그래서 총 이틀 추가.
#include <iostream>
using namespace std;
int HowManyDays(int a, int b, int v)
{
int oneday_distance = a - b;
int days = (v - a) / oneday_distance;
int left_distance = v - days * oneday_distance;
if (left_distance <= a) days += 1;
else if (left_distance > a) days += 2;
return days;
}
int main()
{
int A = 0, B = 0, V = 0;
cin >> A >> B >> V;
cout << HowManyDays(A, B, V);
return 0;
}
반응형
'Training > BOJ' 카테고리의 다른 글
[C++] 2446 별 찍기 - 9 (0) | 2020.08.10 |
---|---|
[C++] 10809 알파벳 찾기 (0) | 2020.08.10 |
[C++] 8958 OX퀴즈 (0) | 2020.08.03 |
[C++] 3052 나머지 (0) | 2020.08.03 |
[C++] 2577 숫자의 개수 (0) | 2020.08.03 |