문제
달팽이는 높이가 V미터인 나무 막대를 올라갈 것이다.
달팽이는 낮에 A미터 올라갈 수 있다. 하지만, 밤에 잠을 자는 동안 B미터 미끄러진다. 또, 정상에 올라간 후에는 미끄러지지 않는다.
달팽이가 나무 막대를 모두 올라가려면, 며칠이 걸리는지 구하는 프로그램을 작성하시오.
시간 제한 : 0.15초
입력 : (1 ≤ B < A ≤ V ≤ 1,000,000,000)
풀이
시간 제한이 0.15초이고, 입력이 크기 때문에 단순 반복문으로 풀면 시간초과가 뜰 것 같아 다른 방법으로 풀었다.
달팽이가 하루에 올라가는 높이는 (A-B)
이다.
단, 정상에 올라간 후에는 미끄러지지 않으므로 달팽이는 (V-A)
만큼에 +1일 더 올라가는 것과 같다.
(마지막 날은 -B 높이를 하지않은 A높이 그대로 올라가니까)
따라서, 달팽이는 (V-A)/(A-B)+1
만큼 막대를 올라간다.
이때 (V-A)/(A-B)
가 2.xxx 같은 소수점있는 실수일 경우 달팽이는 3번 올라간 것과 같으므로 천장함수를 사용해 값을 올려준다.
ceil()
: 천장함수 / floor()
: 바닥함수풀이 코드
#include<iostream>
#include<cmath>
using namespace std;
int main(void)
{
cin.tie(NULL); ios_base::sync_with_stdio(false);
int a,b,v;
cin>>a>>b>>v;
cout<<int(ceil((double)(v-a)/(double)(a-b)))+1;
}
a,b,v 변수를 애초에 실수형으로 받아서 형변환을 하지 않고 작성해도 된다.
잡담
예제 입력 3인
입력 : 100 99 1000000000
출력 : 999999901
를 보면서 힌트를 크게 얻은 듯?!
출력이 V에서 A빼고 달팽이가 하루 올라가는 높이 (A-B)를 더한 값과 같다..?
요기서 느낌이 뽝 왔다.