在一个平面上有n(1<=n<=100000)个村庄,每个村庄通过坐标(xi,yi)标示位置,-10^9<=xi,yi<=10^9。现在想要建一个邮局,使得到各个村庄的距离之和最短。
在这个问题中,距离定义为曼哈顿距离,即点i和点j的距离等于|xi-xj|+|yi-yj|
输入:
输入第一行为n,表示村庄的数量
接下来n行每行有两个整数,表示一个村庄的坐标
输出:
输出一个数字,表示建立的邮局到各个村庄的和
Sample Input:
3
0 0
10 10
0 10
Sample Output:
20
提示:
村庄和邮局的坐标都一定为整数
对于超过int的数字,请用long long,输入和读取用%lld
行列不影响。直接求就行。
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<stdlib.h>
int N;
int x[100015],y[100015];
long long cal(int xx,int yy)
{
int i;
long long ans1;
ans1=0;
for(i=0;i<N;i++)
{
ans1=ans1+(abs(xx-x[i])+abs(yy-y[i]));
}
return ans1;
}
int cmp(const void*a,const void*b)
{
return *(int*)a-*(int*)b;
}
int main()
{
int i;
long long ans[10];
long long min_ans=10000000000000000;
scanf("%d",&N);
for(i=0;i<N;i++)
{
scanf("%d%d",&x[i],&y[i]);
}
qsort(x,N,sizeof(int),cmp);
qsort(y,N,sizeof(int),cmp);
ans[0]=cal(x[N/2],y[N/2]);
ans[1]=cal(x[N/2-1],y[N/2]);
ans[2]=cal(x[N/2],y[N/2-1]);
ans[3]=cal(x[N/2-1],y[N/2-1]);
for(i=0;i<=3;i++)
{
if(ans[i]<=min_ans)
min_ans=ans[i];
}
printf("%lld\n",min_ans);
}