각 사람까지의 거리의 합이 최소가 되는 우체국의 위치를 구해야 하는 문제이다.
오늘 재체점에 갑자기 틀렸습니다. 가 떠서 급히 다시 푼 문제이다.
우체국이 설치될 위치는 전체 인구의 중앙이 되는 지점입니다. 이는 총 인구의 절반 지점에 해당하는 위치를 의미한다.
즉, 인구의 합을 2로 나눈 값에 해당하는 누적 인구를 찾아서 그 위치를 결정하면 된다.
<소스코드>
#include <stdio.h>
#include <algorithm>
#include <vector>
using namespace std;
using ll = long long;
int n;
vector <pair<int, int>> vec;
int main()
{
int i, j;
scanf("%d", &n);
ll ans = 0;
for(i=0;i<n;i++) {
int x, y;
scanf("%d %d", &x, &y);
vec.push_back({x, y});
ans += y;
}
sort(vec.begin(), vec.end());
ll res;
if(ans % 2) {
res = (ans + 1) / 2;
}
else {
res = ans / 2;
}
ll now = 0;
for(i=0;i<n;i++) {
now += vec[i].second;
if(now >= res) {
printf("%d", vec[i].first);
return 0;
}
}
return 0;
}
처음에는 거리를 생각안해서 반례가 생긴줄알고, 해당 지점에 우체국을 세웠을 때 우체국과 모든 사람들의 거리의 합을 구했었는데 longlong으로도 overflow가 떠서 다른 방법을 이용해서 풀었다.
'PS(알고리즘 문제풀이) 관련 글 > 백준(Baekjoon)풀이' 카테고리의 다른 글
백준 17353 : 하늘에서 떨어지는 1, 2, ..., R-L+1개의 별 (0) | 2025.01.08 |
---|---|
25487 : 단순한 문제 (Large) (0) | 2025.01.06 |
백준 26091 : 현대모비스 소프트웨어 아카데미 (1) | 2024.09.11 |
백준 17359 : 전구 길만 걷자 (1) | 2024.09.11 |
백준 15991 : 1, 2, 3 더하기 6 (0) | 2024.09.10 |