您的位置:首页 > 其它

HDU 4311 Meeting point-1(曼哈顿距离最小)

2017-11-19 10:33 471 查看
http://acm.hdu.edu.cn/showproblem.php?pid=4311

题意:
在二维坐标中有n个点,现在要从这n个点中选出一个点,使得其他点到该点的曼哈顿距离总和最小。

思路:

离散化分别处理x坐标和y坐标。

将点按照x坐标进行排序,sum数组记录记录前缀和,那么当选第i个点时其余点在x轴到该点的距离为 $(i-1)*p[i].x-sumx[i-1] + (sumx
-sumx[i]) - (n-i)*p[i].x$。

y坐标同理。

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
typedef long long ll;

int n;

struct node
{
ll x,y;
int id;
}p[100005];

ll sumx[100005],sumy[100005];
ll numx[100005],numy[100005];

bool cmp1(node a, node b)
{
return a.x < b.x;
}

bool cmp2(node a, node b)
{
return a.y < b.y;
}

int main()
{
int T;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%lld%lld",&p[i].x,&p[i].y);
p[i].id = i;
}

sumx[0] = sumy[0] = 0;
sort(p+1,p+n+1,cmp1);
for(int i=1;i<=n;i++)  sumx[i] = sumx[i-1] + p[i].x;
for(int i=1;i<=n;i++)  numx[p[i].id] = ((i-1)*p[i].x-sumx[i-1] + (sumx
-sumx[i]) - (n-i)*p[i].x);
sort(p+1,p+n+1,cmp2);
for(int i=1;i<=n;i++)  sumy[i] = sumy[i-1] + p[i].y;
for(int i=1;i<=n;i++)  numy[p[i].id] = ((i-1)*p[i].y-sumy[i-1] + (sumy
-sumy[i]) - (n-i)*p[i].y);

ll ans = numx[1] + numy[1];
for(int i=2;i<=n;i++)
ans=min(ans,numx[i]+numy[i]);
printf("%lld\n",ans);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: