题解:P13080 [NOISG 2017] Best Places / 最佳选址

题解:P13080 [NOISG 2017] Best Places / 最佳选址

Link

形式化题意

给出 \(N\) 个选手的坐标,要求找到一个坐标 \((X,Y)\),使其能最小化 \(\sum|X-X_i|\)\(\sum|Y-Y_i|\)。也就是使所有选手到该点的曼哈顿距离之和最小。

题目思路

因为曼哈顿距离在 \(X\)\(Y\) 方向上是独立的,所以可以分别处理横坐标和纵坐标。

因此问题转化为:在一组数据中,找到一个数使得这个数与其他数的绝对差之和最小。显然这个数是中位数。所以只需求 \(N\)\(X\) 的中位数与 \(N\)\(Y\) 的中位数即可。

让我们回忆一下如何求中位数:

  • \(M=X_{\frac{N+1}{2}}\),此时 \(N \bmod 2 \neq 0\)
  • \(M=\frac{X_{\frac{N}{2}}+X_{\frac{N}{2}+1}}{2}\),此时 \(N \bmod 2 = 0\)

代码实现

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e6+10;
ll n,x[N],y[N],ansx,ansy; 
int main() {
    cin>>n;
    for (int i=1;i<=n;i++){
        cin>>x[i]>>y[i];
    }
    sort(x+1,x+n+1);
    sort(y+1,y+n+1);
    if (n%2==1){
        ansx=x[(n+1)/2];
        ansy=y[(n+1)/2];
    } 
    else{
        ansx=(x[n/2]+x[n/2+1]+1)/2;
        ansy=(y[n/2]+y[n/2+1]+1)/2;
    }
    cout<<ansx<<" "<<ansy;
    return 0;
}
posted @ 2025-08-03 15:43  M1_Byte  阅读(6)  评论(0)    收藏  举报