<2869> 달팽이는 올라가고 싶다
내가 쓴 코드
#include <iostream>
using namespace std;
int main() {
cin.tie(NULL);
ios::sync_with_stdio(false);
// A B V V + x*B <= A*x V <= (A-B)*x >> V/(A-B) <= x
// 1. 아침 +2 밤 -1 2. 아침 +2 밤 -1
int A, B, V, x = 1, T;
cin >> A >> B >> V;
T = A;
while (1)
{
if (V - T <= 0) // 3 2 1 0
break;
T += A - B;
x++;
}
cout << x;
return 0;
}
while문 안에서 계속 더해줘야해서 큰 수가 들어가면 시간초과가 발생한다.
그래서 찾아본 코드
#include <iostream>
using namespace std;
int main() {
cin.tie(NULL);
ios::sync_with_stdio(false);
int A, B, V;
int day;
cin >> A >> B >> V;
day = (V - B - 1) / (A - B) + 1;
cout << day;
return 0;
}
A-B 는 하루동안 달팽이가 올라가는 높이이다.
하지만 이미 도착한 날에는 미끄러지지 않으므로 달팽이가
올라가는 총 높이는 V-B가 된다.
그래서 (V-B)/(A-B)를 하면 되는데 만약 딱 나누어 떨어지지 않는 경우는 하루 더 가야하므로 +1을 해준다.
하지만 그러면 딱 나누어떨어지는 경우에는 정상을 오른 상태에서 하루 더 가는 것이므로 분자에서 -1을 해주어서 맞게 해준다.
ps. 이분탐색으로 구하는 방법도 찾아보자.
cin.tie(NULL); 은 cin 과 cout의 묶음을 풀어준다.
cin으로 데이터를 읽을 때 출력 버퍼에 있는 내용을 비우는데 비우지 않고 먼저 입력을 받는다.
ios::sync_with_stdio(false); 는 C와 C++의 버퍼를 분리하는 역할을 한다.
두 구문으로 cin과 cout을 조금 더 빠르게 쓸 수 있다.