题目描述
在一条数轴上有 N N N 家商店,它们的坐标分别为 A 1 ∼ A N A_1∼A_N A1∼AN。
现在需要在数轴上建立一家货仓,每天清晨,从货仓到每家商店都要运送一车商品。
为了提高效率,求把货仓建在何处,可以使得货仓到每家商店的距离之和最小。
输入格式
第一行输入整数 N N N。
第二行 N N N 个整数 A 1 ∼ A N A_1∼A_N A1∼AN。
输出格式
输出一个整数,表示距离之和的最小值。
数据范围
1 ≤ N ≤ 100000 1≤N≤100000 1≤N≤100000,
0 ≤ A i ≤ 40000 0≤A_i≤40000 0≤Ai≤40000
输入样例
4
6 2 9 1
输出样例
12
题目分析
显然,货仓一定建在所有商店坐标的中位数位置。
我们通过函数图像来验证这个观点:
当商店个数为奇数时, y = ∣ x − A 1 ∣ + ∣ x − A 2 ∣ + … + ∣ x − A n ∣ y=|x-A_1|+|x-A_2|+…+|x-A_n| y=∣x−A1∣+∣x−A2∣+…+∣x−An∣ 的大致图像如下
当 x ≥ A n + 1 2 x\ge A_{\frac {n+1}{2}} x≥A2n+1 时, x x x 越大,函数图像斜率越大,函数值也越大;当 x ≤ A n + 1 2 x\le A_{\frac {n+1}{2}} x≤A2n+1 时, x x x 越小,函数图像斜率(绝对值)越大,函数值也越大。当 x = A n + 1 2 x=A_{\frac {n+1}{2}} x=A2n+1 时,函数值有最小值。
当商店个数为偶数时,可以发现在 A n 2 ≤ x ≤ A n + 2 2 A_{\frac {n}{2}}\le x\le A_{\frac {n+2}{2}} A2n≤x≤A2n+2 时,函数图像持平,所以在该区间内建货仓皆可。方便起见,无论奇偶,我们都在 A ⌊ n + 1 2 ⌋ A_{\lfloor \frac {n+1}{2}\rfloor} A⌊2n+1⌋ 处建货仓。
代码:
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 100010;
int n, a[N];
long long dis;
int main(){
cin >> n;
for (int i = 1; i <= n; i ++) cin >> a[i];
sort(a + 1, a + n + 1);
int mid = a[(n + 1) / 2];
for (int i = 1; i <= n; i ++) dis += abs(a[i] - mid);
cout << dis;
return 0;
}