
点击查看代码
#include<iostream>
#include<algorithm>
using namespace std;
const int N = 1e5 + 10;
int n, res;
int a[N];
int main()
{
cin >> n;
for (int i = 0; i < n; i ++) cin >> a[i];
sort(a, a + n);
int t = a[n / 2];
for (int i = 0; i < n; i ++) res += abs(t - a[i]);
cout << res << endl;
return 0;
}
- 算法思路
最优位置是所有数的中位数,分为奇数个和偶数个两种情况:
① 若数的个数是奇数,中位数唯一
② 若数的个数是偶数,取中间的两个数其中之一即可
- 最优性证明
设距离之和为 \(f\) ,\(x_i\) 为第 \(i\) 个点的坐标,$ x_1 \leqslant x_2 \leqslant \cdots \leqslant x_n $ ,
$ f = |x_1 - x| + |x_2 - x| + \cdots + |x_n - x| = (|x_1 - x| + |x_n - x|) + (|x_2 - x| + |x_{n-1} - x| + \cdots ) \geqslant (x_n - x_1) + (x_{n-1} - x_2) + \cdots $
取等号的前提是 \(x\) 位于区间 \([x_1,x_n], [x_2,x_{n-1}], \cdots\) 的内部,\(x\) 位于中位数的位置