給出n個點的座標,規定兩個點的距離=max(|x1-x2|,|y1-y2|)php
要求選出一個點,使得這個點到全部點的距離和最小
html
切比雪夫轉換例題
node
將一個點(x,y)的座標變爲(x+y,x−y)後spa
原座標系中的切比雪夫距離=新座標系中的曼哈頓距離code
求最小曼哈頓距離就好了xml
關於切比雪夫與曼哈頓距離轉化請左轉htm
#include<cstdio> #include<cstring> #include<cstdlib> #include<algorithm> #include<cmath> #define Maxn 110000 #define mes(x,y) memset(x,y,sizeof(x)) using namespace std; typedef long long LL; struct node{int x,id;}X[Maxn],Y[Maxn]; bool cmp(node n1,node n2){return n1.x<n2.x;} LL Lx[Maxn],Ly[Maxn],Rx[Maxn],Ry[Maxn]; int tx[Maxn],ty[Maxn]; int main() { int n; scanf("%d",&n); for(int i=1;i<=n;i++) { int x,y; scanf("%d%d",&x,&y); X[i].x=x+y;Y[i].x=x-y; X[i].id=Y[i].id=i; } sort(X+1,X+n+1,cmp);sort(Y+1,Y+n+1,cmp); for(int i=1;i<=n;i++) tx[X[i].id]=i,ty[Y[i].id]=i; for(int i=2;i<=n;i++) { Lx[i]=Lx[i-1]+LL(i-1)*(X[i].x-X[i-1].x); Ly[i]=Ly[i-1]+LL(i-1)*(Y[i].x-Y[i-1].x); } for(int i=n-1;i>=1;i--) { Rx[i]=Rx[i+1]+LL(n-i)*(X[i+1].x-X[i].x); Ry[i]=Ry[i+1]+LL(n-i)*(Y[i+1].x-Y[i].x); } LL ans=1LL<<62; for(int i=1;i<=n;i++) ans=min(ans,Lx[tx[i]]+Ly[ty[i]]+Rx[tx[i]]+Ry[ty[i]]); printf("%lld\n",ans/2); return 0; }