문제에 대한 첫 인상
이 문제는 처음 접했을 땐, 이게 골드 문제?! 싶었지만, 문제를 찬찬히 살펴보니 생각보다 고려할게 많았다. 처음엔 “택시 거리"처럼 축을 따라서만 이동할 수 있는줄 알았지만, 그런 제약을 없었다는 것! 따라서 이동할 수 있는 경우의 수는 총 4가지가 있다.
- 대각선을 따라서 그냥 걸어오는 경우
- 대각선을 따라 직전까지 뛰고 나머지를 걸어오는 경우
- 대각선을 따라 한번 저 뛰고 차이만큼 걸어서 돌아오는 경우
- 점프만 이용해서 돌아돌아 오는 경우 (활 꼴 그리는 느낌으로)
- 이 경우 3번의 점프 횟수 만큼 점프해야 한다.
위의 4가지 경우에 맞게 구현해주고 min값을 구해주면 답을 얻어낼 수 있다. 오차를 $ 10^{-9} $ 로 맞춰주라 했기 때문에 cout.precision(16)
정도로 넉넉하게 잡아주면 된다.
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
int X, Y, D, T;
cin >> X >> Y >> D >> T;
double distance = sqrt(pow(X, 2) + pow(Y, 2)); // 대각선 길이
double ans = 0;
int n_jump = 0;
while (n_jump * D < distance){
n_jump += 1;
}
double temp1 = distance - D*(n_jump-1) + T*(n_jump-1);
double temp2 = abs(distance - D*n_jump) + T*n_jump;
if (n_jump < 2){
n_jump = 2;
}
double temp3 = T*n_jump;
ans = min(distance, temp1);
ans = min(ans, temp2);
ans = min(ans, temp3);
cout.precision(16);
cout << ans;
return 0;
}