간단한 해설
N이 최대 10^5, | X[i] |와 A[i] 모두 최대 10^9 이므로 long long형이더라도 overflow가 될 수 있는 가능성을 생각만 해뒀다.
우리가 구하고자 하는 값은 한 지점을 정하고, 그 지점에서 각 사람까지의 거리의 합, 그 합이 최솟값이 되는 지점을 구하고 싶은 것이다.
대충 식으로 표현하면 다음과 같다.
한 지점을 x로 두고, 그 지점에서 각 사람까지의 거리의 합이 f(x)이다.
우리가 고등학교 수학에서 배웠듯이 이 f(x)의 값이 최소가 되는 지점은 무조건 X의 원소인 X[i]이다.
여기서 미분으로 경향성을 찾아도 되고 여러 가지 방법이 있지만, 제일 편한 방법은 그냥 1차 함수이니까 계수만 보면 된다.
A[i]가 절반이 넘어가는 그 순간의 X[i]가 답이다.
답
#include <iostream>
#include <vector>
#include <algorithm>
#define ll long long
using namespace std;
int main(){
cin.tie(0);
ios_base::sync_with_stdio(0);
int n;
cin>>n;
vector<pair<ll,ll>> v(n);
ll p=0;
for(int i=0;i<n;++i){
cin>>v[i].first>>v[i].second;
p+=v[i].second;
}
sort(v.begin(),v.end());
ll gae=0;
for(int i=0;i<n;++i){
gae+=v[i].second;
if(gae*2>=p){
cout<<v[i].first;
break;
}
}
}
'알고리즘 > 백준' 카테고리의 다른 글
백준 1911 흙길 보수하기 C++ (0) | 2025.01.15 |
---|---|
백준 2636 치즈 C++ (0) | 2025.01.09 |
백준 1456 거의 소수 C++ (0) | 2025.01.08 |
백준 17835 면접보는 승법이네 C++ (0) | 2024.12.18 |
백준 5052 전화번호 목록 C++ (0) | 2024.12.11 |