lastknight00

[백준]우체국(2285) 본문

PS

[백준]우체국(2285)

lastknight00 2020. 9. 13. 15:11

문제 링크 : [백준]우체국(2285)

 

2285번: 우체국

첫째 줄에 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 이며 모든 입력은 정수이다. 모든 A[i]를 합친 값은 0

www.acmicpc.net

 

문제 설명

N개의 마을이 있고, 각 마을은 Xi에 위치하고, Ai명의 사람이 산다고 합니다.

이 때, 특정 위치에 우체국을 세웠을 때, 모든 사람과 우체국간의 거리가 최소가 되는 우체국의 위치를 구하세요.

입력

N(마을의 갯수, 1 <= N <= 100,000)

Xi(마을의 위치, -1,000,000,000 <= Xi <= 1,000,000,000)

Ai(마을에 사는 사람의 수, , -1,000,000,000 <= Ai <= 1,000,000,000)

3
1 3
2 5
3 3

 

출력

2

 

카테고리

#삼분탐색

 

시간 복잡도 상한

O(NlogM)(M은 우체국을 놓을 수 있는 위치의 범위)

 

해결 방법

  1. f(x)를 우체국 위치가 x일 때, 모든 사람들까지의 거리라고 정의하면, f(x)는 O(N)에 구할 수 있습니다.
  2. 그리고 f(x)는 이차함수 그래프를 가지기 때문에 삼분 탐색으로 구할 수 있습니다.

시간복잡도

O(NlogM)(M은 우체국을 놓을 수 있는 위치의 범위)

코드

#include<iostream>
#include<algorithm>
#define N 100000
using namespace std;
typedef long long L;
int n,i,l=-1e9,r=1e9,m;
L x,y,a[N],b[N],q;
int main(){
    ios_base::sync_with_stdio(0);cin.tie(0);
    cin>>n;
    for(;i<n;i++)cin>>a[i]>>b[i];
    while(l<=r){
        m=(l+r)/2;
        for(x=y=i=0;i<n;i++){
            x+=abs(a[i]-m)*b[i];
            y+=abs(a[i]-(m+1))*b[i];
        }
        if(x<=y)r=m-1;
        else l=m+1;
    }
    cout<<l;
}

 

'PS' 카테고리의 다른 글

[백준]대한민국(3770)  (0) 2020.09.27
[백준]소가 길을 건너간 이유 11(14459)  (0) 2020.09.22
[백준]블록 쌓기(9998)  (0) 2020.09.13
[백준]빌보의 생일(4442)  (0) 2020.09.10
[백준]중복 제거(13701)  (0) 2020.09.09
Comments