hdu4312 n个平面点选取一个使距离该点切比雪夫距离最小 枚举/快速计算曼哈顿距离

切比雪夫距离和曼哈顿距离就是变成了八个方向只用一步

首先八个方向距离就变成了max(|x1-x2|,|y1-y2|)这样的一个最值式,似乎并没有什么卵用

学到了一个非常机智的转化: max(|x1-x2|,|y1-y2|)=(|x1-x2+y1-y2|+|x1-x2-y1+y2|)/2 。

这个公式需要从两条45°对角线仔细考虑

然后就和4312几乎一样了==

 1 #include<stdio.h>
 2 #include<string.h>
 3 #include<algorithm>
 4 using namespace std;
 5 struct dian{
 6   long long x,y,id;
 7 }a[100005],f[100005];
 8 int cmp1(dian n1,dian n2)
 9 {
10   return n1.y<n2.y;
11 }
12 int cmp2(dian n1,dian n2)
13 {
14   return n1.x<n2.x;
15 }
16 int main()
17 {
18   int T;
19   long long n,i,tmp,minx;
20   scanf("%d",&T);
21   while (T--)
22   {
23     scanf("%lld",&n);
24     for (i=1;i<=n;i++)
25     {
26       scanf("%lld%lld",&a[i].x,&a[i].y);
27       tmp=a[i].x;
28       a[i].x=a[i].x+a[i].y; a[i].y=tmp-a[i].y;
29       a[i].id=i;
30     }
31     sort(a+1,a+n+1,cmp1);
32     tmp=0;
33     for (i=2;i<=n;i++) tmp+=a[i].y-a[1].y;
34     f[a[1].id].x=tmp;
35     for (i=2;i<=n;i++)
36     {
37       tmp+=(i-1)*(a[i].y-a[i-1].y);
38       if (i!=n) tmp-=(n-i+1)*(a[i].y-a[i-1].y);
39       f[a[i].id].x=tmp;
40     }
41     sort(a+1,a+n+1,cmp2);
42     tmp=0;
43     for (i=2;i<=n;i++) tmp+=a[i].x-a[1].x;
44     f[a[1].id].y=tmp;
45     for (i=2;i<=n;i++)
46     {
47       tmp+=(i-1)*(a[i].x-a[i-1].x);
48       if (i!=n) tmp-=(n-i+1)*(a[i].x-a[i-1].x);
49       f[a[i].id].y=tmp;
50     }
51     minx=f[1].x+f[1].y;
52     for (i=2;i<=n;i++)
53       minx=min(minx,f[i].x+f[i].y);
54     printf("%lld\n",minx/2);
55   }
56 }
View Code

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4312

posted on 2015-05-15 20:59  xiao_xin  阅读(621)  评论(6编辑  收藏  举报

导航