ps

[백준] 2141 - 우체국

kariskan 2022. 9. 3. 18:22

https://www.acmicpc.net/problem/2141

 

2141번: 우체국

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

www.acmicpc.net

 

python은 모르겠지만, cpp로 누적합을 이용해 각 지역마다 모든 누적합을 구해준다면 long long overflow가 나게 된다.

10억 * 10억 * 10만.

 

그래서 다른 전략을 취하였다.

거리를 신경 쓰지 않으려면, 사람의 수 만으로 해결해야 한다.

 

잘 생각해보면, 단순히 해당 마을을 기준으로 왼쪽과 오른쪽의 위치해 있는 마을들의 사람 수의 합을 최소로 하게 하면 된다.

따라서 마을 위치 순으로 정렬해준 다음 하나씩 더해가며 답을 구하였다.

 

#include <iostream>
#include <climits>
#include <algorithm>
using namespace std;

int n;
pair<long long, long long> arr[100001];
long long sum;

int main() {

	cin >> n;

	for (int i = 1; i <= n; i++) {
		cin >> arr[i].first >> arr[i].second;
		sum += arr[i].second;
	}

	sort(arr + 1, arr + 1 + n);

	long long ans = 0;

	for (int i = 1; i <= n; i++) {
		ans += arr[i].second;
		if (ans >= (sum + 1) / 2) {
			cout << arr[i].first;
			break;
		}
	}
}