您的位置:首页 > 其它

HDU 4311 Meeting point-1

2012-07-27 18:13 330 查看
题意: 有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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: