1262: 邮局选址问题
时间限制: 1 Sec 内存限制: 128 MB
提交: 13 解决: 9
[提交][状态][讨论版][命题人:admin]
题目描述
问题描述:
在一个按照东西和南北方向划分成规整街区的城市里,n个居民点散乱地分布在不同的街区中。用x 坐标表示东西向,用y坐标表示南北向。各居民点的位置可以由坐标(x,y)表示。街区中任意2 点(x1,y1)和(x2,y2)之间的距离可以用数值|x1-x2|+|y1-y2|度量。
居民们希望在城市中选择建立邮局的最佳位置,使n个居民点到邮局的距离总和最小。
编程任务:
给定n 个居民点的位置,编程计算n 个居民点到邮局的距离总和的最小值。
输入
第1 行是居民点数n,1<10000。< 个整数x 行是居民点的位置,每行2>
输出
n个居民点到邮局的距离总和的最小值。
样例输入
<span style="color:#333333">5
1 2
2 2
1 3
3 -2
3 3
</span>
样例输出
<span style="color:#333333">10</span>
思路:中位数的数学意义就是用来描述数据一般水平,或者说是集中趋势,那么在这道题目中可以知道邮局的位置应该位于这样一个位置:使得|x[i]-x0|的和最小,使得|y[i]-x0|最小,中位数正好可以具有这样的性质。所以可以讲两个数组排序后找出中位数,并进行求和操作即可。
AC代码
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
int main(void)
{
int n;
scanf("%d", &n);
int i, j, x0, y0, k;
int x[100] = {0}, y[100] = {0};
for(i = 0; i < n; i++)
{
scanf("%d %d", &x[i], &y[i]);
}
sort(x, x+n);
sort(y, y+n);
if(n % 2 == 1)
{
k = (n-1)/2;
x0 = x[k];
y0 = y[k];
}
else
{
k = n / 2;
x0 = ((x[k] + x[k-1]) / 2);
y0 = ((y[k] + y[k-1]) / 2);
}
int ans = 0;
for(i = 0; i < n; i++)
{
ans = ans + fabs(x[i]-x0) + fabs(y[i]-y0);
}
printf("%d", ans);
return 0;
}