zoukankan      html  css  js  c++  java
  • 街区最短问题

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

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

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

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

  • 相关阅读:
    Ant
    责任链模式
    日志logback
    知识点
    三个实例演示 Java Thread Dump 日志分析
    IDEA运行编译后配置文件无法找到,或配置文件修改后无效的问题
    IDEA创建MAVEN WEB工程
    多线程源码分析ThreadPoolExecutor
    解决
    微博关系服务与Redis的故事
  • 原文地址:https://www.cnblogs.com/wshyj/p/6193439.html
Copyright © 2011-2022 走看看