曼哈顿距离

来源:互联网 发布:Java 获取项目发布路径 编辑:程序博客网 时间:2024/04/30 22:27

切雪儿距离距离是什么?

走过象棋的人就知道。

这个距离其实就是max(x[i]-x[j],y[i]-y[j]);

就是两个点之间的垂直距离和水平距离之间的最大的那个;这个就是象棋里边的国王和王后走的最短路;

还有一个欧式距离,别人称之为欧几里得距离,也就是我们初中高中学习的两点之间的直线距离,sqrt((x1-y1)^2+(x2-y2)^2);

三维的就是sqrt((x1-y1)^2+(x2-y2)^2+(x3-y3)^2);

当然,四维多维的都可以这样去写;

现在我主要讲的是曼哈顿距离,就是两点之间的垂直距离+水平距离;

讲个故事吧,有一位老司机,开着出租车,从A到达B,

A---------------\

         \

    \

    B

就这样从A到B的最短距离就是水平距离加上垂直距离;

下边来看个例题:

hdu 4311

这道题就是在n个点里边找一个点,使得所有其他的点到达这个点距离距离之和的最小值;

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
typedef struct distance{
long long x,y;
int id;
}dd;
dd a[100005],f[100005];
bool cmp_x(const dd a,const dd b){
return a.x<b.x;
}
bool cmp_y(const dd a,const dd b){
return a.y<b.y;
}
int T,n;
int main(){
scanf("%d",&T);
while(T--){
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
        {
            scanf("%lld%lld",&a[i].x,&a[i].y);
            a[i].id=i;
        }
    sort(a+1,a+1+n,cmp_y);
    long long sum=0;
    for(int i=2;i<=n;i++){
        sum+=a[i].y-a[1].y;
    }
    f[a[1].id].y=sum;
    for(int i=2;i<n;i++){
        sum+=(2*i-2-n)*(a[i].y-a[i-1].y);
        f[a[i].id].y=sum;
    }
    sum+=(n-1)*(a[n].y-a[n-1].y);
    f[a[n].id].y=sum;


    //
    sum=0;
    sort(a+1,a+1+n,cmp_x);
    for(int i=2;i<=n;i++){
        sum+=a[i].x-a[1].x;
    }
    f[a[1].id].x=sum;
//    for(int i=2;i<n;i++){//也可以这样写
//        sum+=(2*i-2-n)*(a[i].x-a[i-1].x);
//        f[a[i].id].x=sum;
//    }
//    sum+=(n-1)*(a[n].x-a[n-1].x);
//    f[a[n].id].x=sum;
    for(int i=2;i<=n;i++){
        sum+=(i-1)*(a[i].x-a[i-1].x);
        if(i!=n)sum-=(n-i+1)*(a[i].x-a[i-1].x);
        f[a[i].id].x=sum;
    }
    //
//    for(int i=1;i<=n;i++)cout<<f[a[i].id].x<<":"<<f[a[i].id].y<<endl;
//    cout<<"-------------"<<endl;
    //
    long long minn=f[a[1].id].x+f[a[1].id].y;
    for(int i=2;i<=n;i++)
        minn=min(minn,f[a[i].id].x+f[a[i].id].y);
    printf("%lld\n",minn);
}
}


0 0
原创粉丝点击