您的位置:首页 > 其它

BIT2014级软件学院程序设计-13 平面上的邮局

2016-03-02 15:47 218 查看
在一个平面上有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);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: