Algorithm

[BOJ] 우체국 2141번 C++

따봉치치 2024. 5. 5. 15:18
728x90

 

문제

수직선과 같은 일직선상에 N개의 마을이 위치해 있다. i번째 마을은 X[i]에 위치해 있으며, A[i]명의 사람이 살고 있다.

이 마을들을 위해서 우체국을 하나 세우려고 하는데, 그 위치를 어느 곳으로 할지를 현재 고민 중이다. 고민 끝에 나라에서는 각 사람들까지의 거리의 합이 최소가 되는 위치에 우체국을 세우기로 결정하였다. 우체국을 세울 위치를 구하는 프로그램을 작성하시오.

각 마을까지의 거리의 합이 아니라, 각 사람까지의 거리의 합임에 유의한다

입력

첫째 줄에 N(1 ≤ N ≤ 100,000)이 주어진다. 다음 N개의 줄에는 X[1], A[1], X[2], A[2], …, X[N], A[N]이 주어진다. 범위는 |X[i]| ≤ 1,000,000,000, 1 ≤ A[i] ≤ 1,000,000,000 이며 모든 입력은 정수이다.

출력

 

첫째 줄에 우체국의 위치를 출력한다. 가능한 경우가 여러 가지인 경우에는 더 작은 위치를 출력하도록 한다.

 

접근 방식

 

문제에서 각 사람까지의 거리의 합이 최소가 되는 위치를 구해야 함을 주의해야 한다

따라서 누적합을 이용해 최소가 되는 위치를 구할 수 있다

 

최소가 되는 우체국의 위치는 인구수가 우체국을 기준으로 절반씩 나눠지는 위치다

따라서 총 인구수를 구한다음, 누적 인구수를 구하면서 절반으로 나눠지는 위치에 우체국을 설치하면 된다!

 

 

코드

 

#include<bits/stdc++.h>
using namespace std;

typedef long long ll;

int main() {
    int N; cin>>N;
    vector<pair<int,int>> v(N+1);
    ll total = 0;
    for(int i=1; i<=N; i++) {
        int x,a; cin>>x>>a;
        v[i] = {x,a};
        total += a;
    }
    sort(v.begin()+1, v.end());

    ll population = 0;

    for(int i=1; i<=N; i++) {
        population += v[i].second;
        if(population >= (total + 1) / 2) {
            cout<<v[i].first;
            break;

        }
    }
    


}

 

주의할 점은 인덱스가 1부터 시작하는데

sort 메서드를 v.begin()이 아닌 v.begin() + 1로 잡아주어야 한다는 점이다!!!

 

728x90