原题链接:
题解:
min(所有商店到仓库的距离之差的绝对值之和),这是我们的目的
一切的根本所参考的就是不等式:|X-a|+|X-b| >= |a-b|
根据上述公式,因此选择中位数作为商店位置最好。
如果是排序得中位数,时间复杂度是O(nlong);
也可以采用nth_element() O(n)复杂度求第k小元素
代码:
sort排序:(时间复杂度为O(nlogn))
#include<bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
int n, a[N], res;
int main(){
cin >> n;
for (int i = 0;i < n;i++) cin >> a[i];
sort(a, a + n);
for (int i = 0;i < n;i++) res += abs(a[i] - a[n / 2]);
cout << res;
}
nth_element:(时间复杂度为O(n))
#include<bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
int n, a[N], res;
int main(){
cin >> n;
for (int i = 0;i < n;i++) cin >> a[i];
nth_element(a, a + n / 2, a + n);
for (int i = 0;i < n;i++) res += abs(a[i] - a[n / 2]);
cout << res;
}
疑惑点:
为何将上述的res += abs(a[i] - a[n / 2]);改为res += abs(a[i] - a[i / 2]);也能AC?