平面上的邮局

平面上的邮局


在一个平面上有n(1<=n<=100000)个村庄,每个村庄通过坐标(xi,yi)标示位置,-10^9<=xi,yi<=10^9。现在想要建一个邮局,使得到各个村庄的距离之和最短。
在这个问题中,距离定义为曼哈顿距离,即点i和点j的距离等于|xi-xj|+|yi-yj|
输入第一行为n,表示村庄的数量
接下来n行每行有两个整数,表示一个村庄的坐标
输出一个数字,表示建立的邮局到各个村庄的和

提示:

村庄和邮局的坐标都一定为整数

对于超过int的数字,请用long long,输入和读取用%lld

input:

3
0 0
10 10
0 10
output:

20


这道题的曼哈顿距离,就是只用计算横竖距离即可。而在两个点(再加上xy坐标)构成的矩形里的任何一点时距离之和就是固定的。而又不用找这样的点,只用找距离,这样就简单许多了,也就直接把这些矩形的长和宽之和相加就行了。

因为只用求曼哈顿距离,所以分开,分别求x轴和y轴的距离就行。至于找矩形长/宽的长度,就是x轴上最左和最右的连起来,次左和次右的连起来……把这些长度都加起来就是x方向的了。y轴一样。由此即可得到结果。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int comp(const void *a,const void *b)
{
	return *(long long *)a-*(long long *)b;
}
int main()
{
	long long int s,x[100001],y[100001];
	int n,i,j;
	scanf ("%d",&n);
	for (i=0;i<n;i++)
	{
		scanf ("%lld %lld",&x[i],&y[i]);
	}
	qsort(x,n,sizeof(long long int),comp);//对x[]进行从小到大排序 
	qsort(y,n,sizeof(long long int),comp);//对y[]进行从小到大排序
	for (s=0,j=0;2*j+1<n;j++){
		s+=(x[n-1-j]-x[j])+(y[n-1-j]-y[j]);
	}
	printf ("%lld\n",s);
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值