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

来源:互联网 发布:软件开发硬件环境 编辑:程序博客网 时间:2024/05/01 12:41

题目地址: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\n",sum);    }    return 0;}


1 0