题解:P13080 [NOISG 2017] Best Places / 最佳选址
题解:P13080 [NOISG 2017] Best Places / 最佳选址
形式化题意
给出 \(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;
}