【题解】AcWing 104.货仓选址

AcWing 104.货仓选址

题目描述

在一条数轴上有 N N N 家商店,它们的坐标分别为 A 1 ∼ A N A_1∼A_N A1AN

现在需要在数轴上建立一家货仓,每天清晨,从货仓到每家商店都要运送一车商品。

为了提高效率,求把货仓建在何处,可以使得货仓到每家商店的距离之和最小。

输入格式

第一行输入整数 N N N

第二行 N N N 个整数 A 1 ∼ A N A_1∼A_N A1AN

输出格式

输出一个整数,表示距离之和的最小值。

数据范围

1 ≤ N ≤ 100000 1≤N≤100000 1N100000
0 ≤ A i ≤ 40000 0≤A_i≤40000 0Ai40000

输入样例

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=xA1+xA2++xAn 的大致图像如下

在这里插入图片描述
x ≥ A n + 1 2 x\ge A_{\frac {n+1}{2}} xA2n+1 时, x x x 越大,函数图像斜率越大,函数值也越大;当 x ≤ A n + 1 2 x\le A_{\frac {n+1}{2}} xA2n+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}} A2nxA2n+2 时,函数图像持平,所以在该区间内建货仓皆可。方便起见,无论奇偶,我们都在 A ⌊ n + 1 2 ⌋ A_{\lfloor \frac {n+1}{2}\rfloor} A2n+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;
}

猜你喜欢

转载自blog.csdn.net/f4u4u4r/article/details/121505293