풀이
이 문제는 별다른 알고리즘 사용없이 모든 케이스를 잘 생각해야하는 문제다.
케이스는 5가지가 있다.
1. 그냥 걸어가는 경우
2. 점프하고 남은 거리 걷는 경우
3. (0, 0)을 넘어서까지 한번 더 점프하고 뒤로 걷는 경우
4. 방향을 꺾어서 j + 1 번 점프하는 경우
5. 점프만 두번 하는 경우
코드
#include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std;
int main() {
int x, y, d, t; scanf("%d %d %d %d", &x, &y, &d, &t);
double dist = sqrt(x * x + y * y);
int jump = dist / d;
double remain = dist - jump * d;
//그냥 걷는 경우, 점프 하고 남은 거리 걷는 경우
double ans = min(dist, remain + jump * t);
//(0, 0) 넘어서까지 점프하고 뒤로 걷는 경우
ans = min(ans, (jump + 1) * d - dist + (jump + 1) * t);
if (jump > 0) {
//방향 꺾어서 점프만 하는 경우
ans = min(ans, double(jump + 1) * t);
} else {
//점프만 두번 하는 경우
if (dist < d) ans = min(ans, t * 2.0);
}
printf("%.9lf", ans);
}
'Algorithm > BOJ' 카테고리의 다른 글
백준 [1311] 할 일 정하기 1 (0) | 2021.07.03 |
---|---|
백준[11723] 집합 (0) | 2021.07.03 |
백준[7869] 두 원 (0) | 2021.06.30 |
백준[2162] 선분 그룹 (0) | 2021.06.30 |
백준[17387] 선분 교차 2 (0) | 2021.06.30 |