1749 - 邮局选址问题
邮局选址问题
【问题描述:】
在一个按照东西和南北方向划分成规整街区的城市里,n个居民点散乱地分布在不同的街区中。用x坐标表示东西向,用y坐标表示南北向。各居民点的位置可以由
坐标(x,y)表示。街区中任意2点(x1,y1)和(x2,y2)之间的距离可以用数值|x1-x2|+|y1-y2|度量。
居民们希望在城市中选择建立邮局的最佳位置,使n个居民点到邮局的距离总和最小。
【数据输入:】 第1行是居民点数n,1≤n≤10000。接下来n行是居民点的位置,每行2个整数x和y,-10000≤x,y≤10000。
【结果输出:】 1个数,是n个居民点到邮局的距离总和的最小值。
【输入文件示例】
5
1 2
2 2
1 3
3 -2
3 3
【输出文件示例】
10
Input
Output
Examples
Input
Output
Solution C++
#include<iostream> #include<algorithm> #include<cstdlib> using namespace std; int main() { int n; cin>>n; int x[n+1],y[n+1],sum=0; 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) { int t=y[n/2+1]; for(int i=1;i<=n;i++) { if(y[i]>t) sum+=y[i]-t; if(y[i]<=t) sum+=t-y[i]; } t=x[n/2+1]; for(int i=1;i<=n;i++) { if(x[i]>t) sum+=x[i]-t; if(x[i]<=t) sum+=t-x[i]; } } if(n%2==0) { int t=(y[n/2]+y[n/2+1])/2; for(int i=1;i<=n;i++) { if(y[i]>t) sum+=y[i]-t; if(y[i]<=t) sum+=t-y[i]; } t=(x[n/2]+x[n/2+1])/2; for(int i=1;i<=n;i++) { if(x[i]>t) sum+=x[i]-t; if(x[i]<=t) sum+=t-x[i]; } } cout<<sum; return 0; }