• NYOJ 7-街区最短路径问题(曼哈顿距离)


    题目地址:NYOJ 7

    曼哈顿距离:两点在南北方向上的距离加上在东西方向上的距离,即d(i。j)=|xi-xj|+|yi-yj|。

    对于一个具有正南正北、正东正西方向规则布局的城镇街道。从一点到达还有一点的距离正是在南北方向上旅行的距离加上在东西方向上旅行的距离。

    思路:由于仅仅能东西和南北方向走,所以先把南北(X)和东西(Y)方向的坐标分开。分别求它们的最值。然后相加就可以。分析能够得知,邮局的所建点必须在居民点上,要不然所得的值总会比最小值多出一部分来。知道这个然后让我们来分析:如果在坐标轴X上有n个点,是从1到n,我们所求的目标点在x上,先求点1和n到x的距离仅仅和,非常显然x点在1到n之间。然后再求2和n-1到x的距离之和,非常显然x点在2和n-1之间,如此反复下去。x的范围不断减小,最后成为中位点。

    #include <stdio.h>
    #include <math.h>
    #include <string.h>
    #include <stdlib.h>
    #include <iostream>
    #include <sstream>
    #include <algorithm>
    #include <set>
    #include <queue>
    #include <stack>
    #include <map>
    using namespace std;
    typedef long long LL;
    const int inf=0x3f3f3f3f;
    const double pi= acos(-1.0);
    const double esp=1e-6;
    const int maxn=21010;
    int main() {
        int n,m,i,j;
        int sum;
        int x[30],y[30];
        scanf("%d",&n);
        while(n--) {
            memset(x,0,sizeof(x));
            memset(y,0,sizeof(y));
            sum=0;
            scanf("%d",&m);
            for(i=0; i<m; i++)
                scanf("%d %d",&x[i],&y[i]);
            sort(x,x+m);
            sort(y,y+m);
            for(i=0; i<m/2; i++) {
                sum+=(x[m-i-1]-x[i])+(y[m-i-1]-y[i]);
            }
            printf("%d
    ",sum);
        }
        return 0;
    }
    


  • 相关阅读:
    Linux 安装SonarQube
    Linux 安装postgresql
    如何为chrome浏览器设置socks5代理
    echarts tab切换宽度变为100px解决方案
    将url参数转为对象
    一行js代码实现时间戳转时间格式
    解决问题的方法论
    李笑来的幻灯课
    随便写写(最近更新于2021/07/18早)
    谈谈装系统这件事
  • 原文地址:https://www.cnblogs.com/zhchoutai/p/7293898.html
Copyright © 2020-2023  润新知