• 街区最短问题


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

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

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

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

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

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

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

    输入
    第一行一个整数n<20,表示有n组测试数据,下面是n组数据;
    每组第一行一个整数m<20,表示本组有m个住户,下面的m行每行有两个整数0<x,y<100,表示某个用户所在街区的坐标。
    m行后是新一组的数据;
    输出
    每组数据输出到邮局最小的距离和,回车结束;
    重点在于:只能沿东西南北四个方向前行而且是所有点到邮局距离最短  加  数学知识 一条直线上若有N个点  其中间N/2的点 到其他点距离之和最小
    随便想想:确定二维平面的一个点坐标,x坐标不影响y坐标,y坐标不影响x坐标,也就是说找到一个最优x再找到一个最优y  结合起来就是最优点
    重要思想:求解最优问题 常用贪心与动态规划
                  本题适用贪心 因为求最优点坐标可拆分为求 最优x坐标与最优y坐标  求法见数学知识


    #include <stdio.h>
    #include <stdlib.h>
    int cmp(const void *a,const void *b)
    {
    return *(int *)a - *(int *)b;
    }
    int main()
    {
    int N,x[200],y[200];
    scanf("%d",&N);
    while(N--)
    {
    int i,j,m,sum=0;
    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);//排序是为了找N点的中间点
    for(i=0;i<m;i++)
    {
    sum+=abs(x[i]-x[m/2])+abs(y[i]-y[m/2]);
    }
    printf("%d ",sum);
    }
    return 0;
    }

  • 相关阅读:
    小程序导航栏跟随滑动
    前端每日一题
    Spring框架学习——AOP的开发
    Spring框架学习-Spring的AOP概念详解
    SpringIOC学习_属性注入(依赖注入)
    hibernate与struts2整合中出现问题以及一级缓存查询数据在业务层问题
    工具类学习-java实现邮件发送激活码
    Spring框架学习-搭建第一个Spring项目
    Spring框架学习-Spring和IOC概述
    Hibernate学习——持久化类的学习
  • 原文地址:https://www.cnblogs.com/wshyj/p/6193439.html
Copyright © 2020-2023  润新知