Training/BOJ

[C++] 2869 달팽이는 올라가고 싶다

FATKITTY 2020. 8. 8. 23:54
반응형

 

 

먼저 가장 확실한 것부터 처리하고 시작한다.

정상에 올라가기 전까지, 하루에 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