<소스코드>
#include <iostream>
using namespace std;
int main() {
long long a, b, v;
cin >> a >> b >> v;
long double realday = 0;
long long day = 0;
realday = (long double)(v-a)/(a-b) + 1;
day = (v-a)/(a-b) + 1;
if(realday == day){
cout << day << endl;
}else{
cout << day+1 << endl;
}
return 0;
}
//배운점 : 시간 짧으면 왠만하면 반복문 쓰지 말기 , long double
- 변수
long long a : 낮에 올라가는 길이
long long b : 밤에 미끄러지는 길이
long long v : 나무막대 높이
long long day : 걸리는 날짜
long double realday : 정확한 날짜(실수값)
- 알고리즘
1) 처음에는 움직인 값을 식으로 만들어서 day값을 늘려주는 while문을 돌렸는데 시간초과가 나와서 패쓰while(1){ move = a + (day-1)*(a-b); if(move >= v){ cout << day << endl; return 0; } day++; }
2) 달팽이의 하루 운동량(a-b)을 기준으로 하는 등차수열을 만들었다. 초항은 달팽이가 최고점을 찍는 시간은 언제나 아침이기 때문에 a로 정했다. 그래서 v = a + (day-1)(a-b)라는 식이 나왔고 이것을 day에 관한 식으로 정리해서
day = (v-a)/(a-b) +1로 나왔다.
3) 여기서 문제는 이 값이 소수점 값으로 나오는 경우이다. 그래서 realday라는 변수를 통해 실제 날짜와 비교를 해서 같으면 딱 맞아떨어지는 것임으로 day를 출력하고 아니라면 날짜는 소수일 수 없기 때문에 day+1을 출력해서 완벽해지는 다음날을 출력해주었다.
- 배운점
long double : 실수 범위 큰거 필요할 때 사용하자.
- 아쉬운점&느낀점
시간이 짧으면 왠만하면 공식으로 쓰자