PS

BOJ 31410 : 제독 작전

lickelon 2024. 3. 16. 23:44
  • 문제 링크 : boj.kr/31410
  • 난이도 : G3
  • 태그 : 그리디, 정렬
 

31410번: 제독 작전

부대에 미확인 오염 물질이 발생해 위기에 빠졌다! 오염 물질은 부대 내의 수직선 위의 서로 다른 $N$개의 위치에 발생했으며, 그중 $i$번째 오염 물질의 오염도는 $p_i$이며 $x_i$ 위치에 발생했다.

www.acmicpc.net


코드

#include <bits/stdc++.h>

#define all(x) (x).begin(), (x).end()

#define INF 0x7FFFFFFF

using namespace std;

using ll = long long;
using ld = long double;
using pii = pair<int,int>;
using pll = pair<ll, ll>;

int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0); cout.tie(0);

    int n;
    cin >> n;
    vector<pll> arr(n);
    for(auto &u : arr) {
        cin >> u.first >> u.second;
    }
    sort(all(arr));
    ll l = arr[0].second, r = arr[n-1].second;
    ll ans;
    for(int i = 1; i < n; i++) {
        if(i == n-1) ans = l;
        l += arr[i].second;
        l += (i) * (arr[i].first - arr[i-1].first);
    }
    for(int i = n-2; i >= 0; i--) {
        if(i == 0) ans = min(ans, r);
        r += arr[i].second;
        r += (n-1-i) * (arr[i+1].first - arr[i].first);
    }
    for(int i = 0; i < n; i++) {
        ans = min(ans, l - (arr[i].second + arr[n-1].first - arr[i].first));
        ans = min(ans, r - (arr[i].second + arr[i].first - arr[0].first));
    }
    cout << ans;

    return 0;
}

풀이

끝에서 끝까지 한 방향으로 이동하며 제독하는 것이 최적임을 알 수 있다.

끝에서 끝까지 이동하는 것을 두 방향으로 나누어 값을 구한다.

구해놓은 값을 이용해 끝까지 이동하며 중간에 어떤 오염물질을 제독하지 않고 그대로 이동하는 경우를 계산한다.

여기서 마지막의 오염물질을 제독하지 않는 경우 이러한 방법으로 구할 수 없기 때문에, 미리 모든 오염물질을 제독하는 경우의 값을 구할 때 구해놓는다.

'PS' 카테고리의 다른 글

BOJ 30878 : 약속 시간  (0) 2024.03.18
BOJ 24337 : 가희와 탑  (0) 2024.03.17
BOJ 17432 : 정렬  (0) 2024.03.15
BOJ 13884 : 삭삽 정렬  (0) 2024.03.14
BOJ 20158 : 사장님 달려가고 있습니다  (0) 2024.03.13