题目链接: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 }