切雪儿距离距离是什么?
走过象棋的人就知道。
这个距离其实就是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的最短距离就是水平距离加上垂直距离;
下边来看个例题:
这道题就是在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);
}
}