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 }

 

posted on 2013-10-04 13:29  leiatpku  阅读(384)  评论(0编辑  收藏  举报