11081 邮局选址
时间限制:1000MS 代码长度限制:10KB
提交次数:0 通过次数:0
题型: 编程题 语言: G++;GCC;VC
Description
道路东西走向和南北走向,将街区划分为格状,x坐标表示东西向,y坐标表示南北向,街区中任意两 点(x1,y1)和(x2,y2)之间距离用|x1-x2|+|y1-y2|度量。 现有n个居民点随机分布在不同街区,已知所有居民点位置(x,y)坐标,在这片区域中选一个邮局的最 佳建设位置,使得n个居民点到邮局的距离总和最小。
输入格式
第一行居民点数n,1<=n<=10000,接下来n行是居民点的位置,每行两个坐标值x和y。
输出格式
这n个居民点到邮局的距离总和最小值。
输入样例
5 1 2 2 2 1 3 3 -2 3 3
输出样例
10
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <math.h>
using namespace std;
int main()
{
int n;
scanf("%d",&n);
int x[n],y[n];
int x0,y0;//最佳位置
int sum=0;//路程和
for (int i=0;i<n;i++)
{
scanf("%d %d",&x[i],&y[i]);
}
//别忘了用sort
sort(x,x+n);
sort(y,y+n);
//n是奇数
if ((n/2)*2!=n)
{
x0=x[n/2];
y0=y[n/2];
}
else
{
x0=(x[n/2]+x[n/2-1])/2;
y0=(y[n/2]+y[n/2-1])/2;
}
for (int i=0;i<n;i++)
{
sum = sum + fabs(x[i]-x0)+fabs(y[i]-y0);
}
printf("%d",sum);
return 0;
}