标签:style blog http color strong os
2 3 1 1 2 1 1 2 5 2 9 5 20 11 9 1 1 1 20
2 44
解题思路:代码很简单,不过题目值得思考!假设邮局坐标为<X,Y>,那么距离和为 for(i = 0; i < m; i++) sum += abs(xi-X)+abs(yi-Y);
为使sum最小,可以分别考虑X和Y的位置。考虑X,将xi按小到大进行排序,那么我们如何安放X呢,使abs(xi-X)的和最小呢?当然,放在中间了,使其在任意两间房子的连线上。那么假设有两个房子,那么abs(x1-X)+abs(x2-X) = x2-x1;因为x1 < x2;同样求得y的和;再根据曼哈顿距离公式,求得得距离和可以保证最小。
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <cstdlib> 5 #include <vector> 6 #include <climits> 7 #include <algorithm> 8 #include <cmath> 9 #define LL long long 10 using namespace std; 11 int main(){ 12 int kase,x[20],y[20],i,m,ans; 13 scanf("%d",&kase); 14 while(kase--){ 15 scanf("%d",&m); 16 for(i = 0; i < m; i++) 17 scanf("%d %d",x+i,y+i); 18 sort(x,x+m); 19 sort(y,y+m); 20 for(ans = i = 0; i < m/2; i++) 21 ans += x[m-i-1]-x[i] + y[m-i-1]-y[i]; 22 printf("%d\n",ans); 23 } 24 return 0; 25 }
NYOJ 7 街区最短路径问题,布布扣,bubuko.com
标签:style blog http color strong os
原文地址:http://www.cnblogs.com/crackpotisback/p/3835933.html