zoukankan      html  css  js  c++  java
  • 街区最短路径问题-ny-7

    街区最短路径问题

    时间限制:3000 ms  |  内存限制:65535 KB

    难度:4

    描述

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

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

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

    用(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

    解题思路:

    1、  求最短路径,可以把数据分成两组,一个东西街道,一个南北街道。

    2、  分别找两个数组的中位数。

    3、  每个数据到中位数的距离和,就是最短路径之和。

    程序代码:

    #include<stdio.h>

    #include<math.h>

    #include<stdlib.h>

    int cmp(const void *a,const void *b)

    {

        return *(int*)a - *(int*)b;

    }

    int main()

    {

        int x[110],y[110],n,m,i,j,s;

        while(scanf("%d",&n)!=EOF)

        {

            while(n--)

            {

                scanf("%d",&m);

                for(i=0;i<m;i++)

                {

                    scanf("%d %d",&x[i],&y[i]);

                }

                qsort(x,m,sizeof(x[0]),cmp);          // 排序

                qsort(y,m,sizeof(y[0]),cmp);

               // for(i=0; i<m;i++)

               // printf("%d ",x[i]);

               s=0;

               for(i=0; i<m;i++)

                s=s+fabs(x[i]-x[m/2])+fabs(y[i]-y[m/2]);               //找出中位数,然后到中位数的距离之和

                printf("%d ",s);

            }

        }

        return 0;

    }

  • 相关阅读:
    duilib入门简明教程 -- VS环境配置(2) Alberl
    使用libCurl实现断点下载
    通用选择器和高级选择器
    Aforge.net 一个专门为开发者和研究者基于C#框架设计
    iBatis核心框架浅析
    Parameter Binding in ASP.NET Web API(参数绑定)
    图的基本概念
    领域模型中分散的事务如何集中统一处理(C#解决方案)
    .NET 垃圾回收与内存泄漏
    三层架构之泛型抽象工厂
  • 原文地址:https://www.cnblogs.com/zhouhongweihpu/p/3238643.html
Copyright © 2011-2022 走看看