내가 작성한 코드
#include <iostream>
#include <string>
using namespace std;
int main() {
int v = 0, a = 0, b = 0;
cin >> a >> b >> v;
int up = a - b;
int i = (v - a) / up;
if (i * up + a >= v) {
++i;
} else if (v - a % up > 0 ) {
i += 2;
}
cout << i << endl;
return 0;
}
- a - b를 통해서 하루에 올라가는 최종 높이를 구할 수 있으나 정상에 올라가면 내려오지 않기 때문에 마지막 날은 내려가는 계산을 하면 안된다.
- i = v / up로 최대 일수를 구하고 i -= b / up과 같은 방식으로 불필요한 일 수를 제거하고자 하였으나, b / up에서 발생하는 나머지 값을 또 처리를 해주어야 하는 불편함이 있었다.
- 최종적으론 v - a를 통하여 최소 일수를 구하고 여기에 a를 추가하여 v를 넘긴다면 하루 추가 만일 v - a/ up에서 나머지가 남았다면 내려간뒤 다시 올라가도 v에 도달할 수 없으므로 2를 추가하였다.
- 3번의 근거는 a - b 값으로 나눈 나머지는 아무리 커도 a 보다 2가 작을것이고, 그러기 위해선 b의 값이 1이어야 한다. 해서 나머지에 b를 더한 최대 값은 a 보다 1이 작다. 그러므로 나머지가 있다면 추가적으로 2일이 필요하다는 것을 알 수 있다.
https://jhnyang.tistory.com/399
제시하는 공식 (v - 1)(a - b) + a >= v
v 에 a를 빼준것이 아닌 내려갈 b를 빼주어 나머지가 있다면 올림 함수를 통해 계산하는 방식이다.
훨씬 간단하다.....