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

本文介绍了一个关于在平面上寻找建立邮局的最佳位置的问题,目标是最小化从该位置到各个村庄的距离之和。使用了曼哈顿距离作为距离度量,并通过中间点法找到了可能的最优解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在一个平面上有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);
}


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值