1262: 邮局选址问题

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;

猜你喜欢

转载自blog.csdn.net/zzuli_xiaomingke/article/details/81264451