article thumbnail image
Published 2021. 7. 1. 17:39

문제 설명

풀이

이 문제는 별다른 알고리즘 사용없이 모든 케이스를 잘 생각해야하는 문제다.

케이스는 5가지가 있다.

1. 그냥 걸어가는 경우

2. 점프하고 남은 거리 걷는 경우

3. (0, 0)을 넘어서까지 한번 더 점프하고 뒤로 걷는 경우

4. 방향을 꺾어서 j + 1 번 점프하는 경우

5. 점프만 두번 하는 경우

3, 4, 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);
}

문제 링크 : https://www.acmicpc.net/problem/1069

'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
복사했습니다!