• nyoj7——街区最短问题


    描述

    一个街区有很多住户,街区的街道只能为东西、南北两种方向。

    住户只可以沿着街道行走。

    各个街道之间的间隔相等。

    用(x,y)来表示住户坐在的街区。

    例如(4,20),表示用户在东西方向第4个街道,南北方向第20个街道。

    现在要建一个邮局,使得各个住户到邮局的距离之和最少。

    求现在这个邮局应该建在哪个地方使得所有住户到邮局距离之和最小;

    输入

    第一行一个整数n<20,表示有n组测试数据,下面是n组数据;
    每组第一行一个整数m<20,表示本组有m个住户,下面的m行每行有两个整数0<x,y<100,表示某个用户所在街区的坐标。
    m行后是新一组的数据;

    输出

    每组数据输出所有住户到邮局最小的距离和,回车结束;

    样例输入

    2

    3

    1 1

    2 1

    1 2

    5

    2 9

    5 20

    11 9

    1 1

    1 20

    样例输出

    2

    44

    示例代码

    #include <iostream>
    #include <stdio.h>
    #include <algorithm>
    
    using namespace std;
    
    const int N = 21;
    int a[N],b[N];
    
    int main()
    {
        int T;
        scanf("%d",&T);
        while(T--)
        {
            int m;
            scanf("%d",&m);
            for(int i=0;i<m;++i)
            {
                scanf("%d%d",&a[i],&b[i]);
            }
            sort(a,a+m);
            sort(b,b+m);
            int sum=0;
            for(int i=0;i<m/2;++i)
            {
                sum+=(a[m-1-i]-a[i])+(b[m-1-i]-b[i]);
            }
            printf("%d
    ",sum);
        }
        return 0;
    }
    

    分析

    由于只能沿着街道走,所以可以分别分析X或者Y坐标。以Y坐标为例,要求所有住户到邮局的最短距离,所有的点在中位数所在的点的上侧都是正的,而在中位数所在点下侧的都应减去,所以只要排序,然后将中位数以上的点的Y坐标减去中位数以下的点的Y坐标即可得到所有住户到邮局最短距离在Y轴方向移动的距离,X轴方向移动的距离类似可求。

  • 相关阅读:
    二柱子在线答题
    SWUST OJ(952)
    SWUST OJ (943)
    FileZilla 客户端连接 FlieZilla 服务器 连接成功读取目录列表却失败的解决办法
    串的模式匹配算法 ------ KMP算法
    lvalue require as increment operand
    c 语言连续输入字符型数据
    [pat]数素数
    [PAT]数字分类
    HDOJ_4540_威威猫系列故事——打地鼠
  • 原文地址:https://www.cnblogs.com/mengnan/p/9307732.html
Copyright © 2020-2023  润新知