본문 바로가기

알고리즘/백준

백준1459 - 걷기(브론즈1)

반응형

문제출처 : https://www.acmicpc.net/problem/1459

 

1459번: 걷기

세준이는 학교에서 집으로 가려고 한다. 도시의 크기는 무한대이고, 도시의 세로 도로는 모든 정수 x좌표마다 있고, 가로 도로는 모든 정수 y좌표마다 있다. 세준이는 현재 (0, 0)에 있다. 그리고 (

www.acmicpc.net

문제풀이)

다음의 경우를 각각 체크해야 된다.

2 * w > s 인 경우에는 모두 축이동만 하는 경우이다.

2 * w < 2 * s 인 경우에는 축이동 두번 하는 것 보다 대각선 두번 이동 하는 경우가 더 좋은 경우이다.

이때 x + y 가 홀수 일때는 반드시 축이동을 한번 해 주어야 한다.

이때는 두 축 중에서 큰 것을 대각선의 갯수로 세어 준후 홀수 라면 대각선의 갯수에서 하나를 빼 준후 축이동을 해 준다.

2*w < s 인 경우에는 대각선 이동을 x,y 축중 작은 축을 대각선 이동 후 남은 것은 축 이동 한다.

#include <iostream>
#include <cstdio>

using namespace std;

int main()
{
    long long x,y,w,s;
    cin >> x >> y >> w >> s;
    long long res = (x + y) * w; ///축으로만 이동하는 경우
    long long maxdiagonal = max(x,y); /// 대각선 2번 이동이 축이동 2번보다 더 좋은 대각선의 갯수
    long long mod = (x+y)%2; /// 대각선의 갯수를 사용하고 남은 수
    res = min(res,(maxdiagonal - mod) * s + mod * w); ///축이동 두번 보다 대각선 이동 2번이 더 작을때.
    long long mindiagonal = min(x,y);/// 대각선의 갯수중 작은것
    long long remainderx = x - mindiagonal; ///사용하고 남은 x 갯수
    long long remaindery = y - mindiagonal; ///사용하고 남은 y 갯수
    res = min(res,mindiagonal * s + (remainderx + remaindery) * w); ///대각선으로 이동후 남은것을 축 이동 하는 경우

    cout << res;

    return 0;
}
반응형