HDU 4311 Meeting point-1 求一个点到其它点的曼哈顿距离之和

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

解题报告:在一个平面上有 n 个点,求一个点到其它的 n 个点的距离之和最小是多少。

  首先不得不说一下做这道题囧的事,杭电用的是__int64,我前面定义的时候用的是__int64,然后后面输出结果的时候格式控制符竟然用了%lld,还小卡了一会,唉,大意了啊。

然后感觉这题好巧妙,做法是将 x 与 y的距离分开求,我也是看了学长博客之后才懂的http://www.cnblogs.com/Lyush/archive/2012/07/27/2611044.html

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<iostream>
 4 #include<cmath>
 5 #include<algorithm>
 6 using namespace std;
 7 
 8 typedef __int64 INT;
 9 
10 struct node
11 {
12     INT x,y;
13     INT tot;
14 }seq[100005];
15 INT sum_x[100005],sum_y[100005];
16 
17 bool cmp(node a,node b)
18 {
19     return a.x < b.x;
20 }
21 bool comp(node a,node b)
22 {
23     return a.y < b.y;
24 }
25 
26 int main()
27 {
28     int T,n;
29     scanf("%d",&T);
30     while(T--)
31     {
32         scanf("%d",&n);
33         for(int i = 1;i <= n;++i)
34         seq[i].tot = 0;
35         for(int i = 1;i <= n;++i)
36         scanf("%I64d %I64d",&seq[i].x,&seq[i].y);
37         sort(seq+1,seq+n+1,cmp);
38         memset(sum_x,0,sizeof(sum_x));
39         for(int i = 1;i <= n;++i)
40         sum_x[i] = sum_x[i-1] + seq[i].x;
41         for(int i = 1 ; i <= n;++i)
42         {
43             seq[i].tot += ( (i -1 ) * seq[i].x - sum_x[i-1]);
44             seq[i].tot += (sum_x[n] - sum_x[i] - (n - i) * seq[i].x);
45         }
46         sort(seq+1,seq+n+1,comp);
47         memset(sum_y,0,sizeof(sum_y));
48         for(int i = 1; i <= n;++i)
49         sum_y[i] = sum_y[i-1] + seq[i].y;
50         for(int i = 1;i <= n;++i)
51         {
52             seq[i].tot += ( (i-1) * seq[i].y - sum_y[i-1]);
53             seq[i].tot += ( sum_y[n] - sum_y[i] - (n - i) * seq[i].y);
54         }
55         INT ans = 0x7fffffffffffffff;
56         for(int i = 1;i <= n;++i)
57         ans = min(seq[i].tot,ans);
58         printf("%I64d
",ans);
59     }
60     return 0;
61 }
View Code
原文地址:https://www.cnblogs.com/xiaxiaosheng/p/3360255.html