SOLDIERS(POJ 1723)
这个题和算法书上的2.22题类似,因此y轴只要求出中位数,然后所有的点都要移动到中位数。
x轴的情况有点不同, 想了好久终于想明白了。
首先将x升序排序(因为最终的相对位置是不变的),然后设首个元素的基准点为P,则|x[0] - (p+0)| + |x[1] - (p+1)| + |x[2] - (p+2)| + ... + |x[n-1] - (p+n-1)| = |x[0]-0-P| + |x[1]-1-P| + |x[2]-2-P| +...+|x[n-1]-(n-1)-P|,设z[i] = x[i] - i; 这时候就和y类似了, 只要对z数组升序排序,然后找到中位数,再计算就可以了。
ac的代码:
1 // 2 // main.cpp 3 // tests 4 // 5 // Created by zanglei on 13-9-29. 6 // Copyright (c) 2013年 zanglei. All rights reserved. 7 // 8 9 #include <iostream> 10 #include <cstdio> 11 #include <cstdlib> 12 #include <string> 13 #include <vector> 14 #include <cassert> 15 #include <cmath> 16 #include <algorithm> 17 using namespace std; 18 19 #define MAX 10100 20 21 int x[MAX], y[MAX]; 22 23 int main(int argc, const char * argv[]) 24 { 25 int n; 26 cin >> n; 27 for (int i = 0; i < n; i++) 28 cin >> x[i] >> y[i]; 29 30 int result = 0; 31 sort(y, y + n); 32 int mid = y[n / 2]; 33 34 for (int i = 0; i < n; i++) 35 result += abs(y[i] - mid); 36 37 sort(x, x + n); 38 39 for (int i = 0; i < n; i++) 40 x[i] -= i; 41 42 sort(x, x + n); 43 mid = x[n / 2]; 44 45 for (int i = 0; i < n; i++) 46 result += abs(x[i] - mid); 47 48 cout << result << endl; 49 return 0; 50 }