超级经典的初中数学题。
现将 $A$ 从小到大进行排序,设货仓建在 $x$,$x$ 左侧有 $p$ 家店,右侧有 $q$ 家店。
- 如果 $p < q$,那么 $x$ 每右移一个单位长度,距离之和就会变小 $q - p$
- 如果 $p > q$,那么 $x$ 每左移一个单位长度,距离之和就会变小 $p - q$
所以,我们应该将店设在最中间,即中位数。具体地,如果 $n$ 是奇数,那货仓就建在 $A_{\frac{n + 1}{2}}$ 处;如果 $n$ 是偶数,那货仓就可以建在 $[A_\frac{n}{2}, A_\frac{n+1}{2}]$ 上的任意位置。
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 100010;
int n, a[N];
int main() {
scanf("%d", &n);
for (int i = 1; i <= n; i ++) scanf("%d", &a[i]);
sort(a + 1, a + 1 + n);
int m = (1 + n) / 2;
long long ans = 0;
for (int i = 1; i <= n; i ++) ans += abs(a[i] - a[m]);
printf("%d\n", ans);
return 0;
}