HDU 4311 Meeting point-1
题意: 有N 个点,且这些点都在整数坐标上,找出一个点使得所有点到这个点的曼哈顿距离和最小。
分析:可以以每个点为中心,把平面分别按 位于该点上方, 位于该点下方, 位于该点左方, 位于该点右方,
可以先对 X 排序,
记点的左方所有点到该点的 X 坐标距离差之和为 LX
记点的右方所有点到该点的 X 坐标距离差之和为 RX
求出第一个点的 LX,RX 后,后面的点可依次有前一个点推出
即 LX2=LX+i*dx
RX2=RX-(n-i)*dx
每个点上方的 Y 距离差之和 SY,和下方的 XY 求法同上,
最后枚举每个点的 LX+RX+XY+SY 找出最大值即可。
#include<stdio.h> #include<string.h> #include<stdlib.h> struct node { __int64 x,y,xu; __int64 lx,rx,sy,xy; }p[100005]; int cmp1(const void*p1,const void*p2) { node *a=(node*)p1; node *b=(node*)p2; return a->x-b->x; } int cmp2(const void*p1,const void*p2) { node *a=(node*)p1; node *b=(node*)p2; return a->y-b->y; } int main() { // freopen("D:ce.txt","r",stdin); __int64 t,i,n,lx,rx,sy,xy; scanf("%I64d",&t); while(t--) { scanf("%I64d",&n); for(i=0;i<n;i++) scanf("%I64d%I64d",&p[i].x,&p[i].y); qsort(p,n,sizeof(p[0]),cmp1); p[0].lx=0; p[0].rx=0; for(i=1;i<n;i++) p[0].rx+=p[i].x-p[0].x; for(i=1;i<n;i++) { p[i].lx=p[i-1].lx+i*(p[i].x-p[i-1].x); p[i].rx=p[i-1].rx-(n-i)*(p[i].x-p[i-1].x); } qsort(p,n,sizeof(p[0]),cmp2); p[0].sy=0; p[0].xy=0; for(i=1;i<n;i++) p[0].xy+=p[i].y-p[0].y; for(i=1;i<n;i++) { p[i].sy=p[i-1].sy+i*(p[i].y-p[i-1].y); p[i].xy=p[i-1].xy-(n-i)*(p[i].y-p[i-1].y); } __int64 res=p[0].lx+p[0].rx+p[0].sy+p[0].xy; for(i=1;i<n;i++) if(p[i].lx+p[i].rx+p[i].sy+p[i].xy<res) res=p[i].lx+p[i].rx+p[i].sy+p[i].xy; printf("%I64d\n",res); } return 0; }