SOLDIERS(中位数)

题目链接

这道题是对一维中位数定理的一个延伸,变成了二维的形式,其实本质是一样的,只不过要多操作几步。

对于本道题,要确定一个最短长度,那么首先要确定在哪一行,即纵坐标是多少。

因此这就变成了求中位数的情况,那么先对所有的纵坐标进行排序,排序完成之后确定纵坐标的中点,然后遍历所有坐标,将其与中点坐标的纵坐标相减取绝对值,那么y方向上的距离就求好了,并且是y方向上的最短距离。

对于横坐标刚开始没看到要相连。。。对于求横坐标的最短距离,由于是相连的,那么假设第一个相连的横坐标是k,那么接下来的n-1个点的横坐标分别是k+1, k + 2 ... , k + n - 1, 并且设当前最左边的一个士兵的横坐标为X0,那么横坐标的最短距离就是 S = |K-X0| + |K + 1 - X1| + |K + 2 - X2| + ... + |K + N - 1 - (XN- 1) |,而K则是横坐标的中点。

那么这就很清楚了,代码如下:

 1 #include <iostream>
 2 #include <algorithm>
 3 #include <cmath>
 4 using namespace std;
 5 
 6 const int N = 10010;
 7 
 8 int a[N], b[N];
 9 
10 int main(){
11     int n, cnt = 0;
12     cin >> n;
13     for(int i = 0; i < n; i ++)
14         cin >> a[i] >> b[i];
15     sort(b, b + n);
16     sort(a, a + n);
17     int mid = n / 2;
18     for(int i = 0; i < n; i ++){
19         a[i] -= i;
20         cnt += abs(b[mid] - b[i]);
21     }
22     sort(a, a + n);
23     for(int i = 0; i < n; i ++)
24         cnt += abs(a[mid] - a[i]);
25     cout << cnt << endl;
26 
27     return 0;
28 }
原文地址:https://www.cnblogs.com/pureayu/p/13946490.html