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;
}

 

posted @ 2012-07-27 18:13  'wind  阅读(253)  评论(0编辑  收藏  举报