AcWing AC104 货舱选址
更好的阅读感受:https://www.cnblogs.com/sweepy/p/ac104.html
每日一题D1
URL:https://www.acwing.com/problem/content/106/
题面描述
在一条数轴上有 $N$ 家商店,它们的坐标分别为 $A_1$~$A_N$。
现在需要在数轴上建立一家货仓,每天清晨,从货仓到每家商店都要运送一车商品。
为了提高效率,求把货仓建在何处,可以使得货仓到每家商店的距离之和最小。
输入格式
第一行输入整数N。
第二行N个整数$A_1$~$A_N$。
输出格式
输出一个整数,表示距离之和的最小值。
数据范围
$1 \le N \le 100000$,
$0 \le A_i \le 40000$
输入样例:
4
6 2 9 1
输出样例:
12
AC Code
// 在一条数轴上有 N 家商店,它们的坐标分别为 A1~AN。
// 现在需要在数轴上建立一家货仓,每天清晨,从货仓到每家商店都要运送一车商品。
// 为了提高效率,求把货仓建在何处,可以使得货仓到每家商店的距离之和最小。
#include <bits/stdc++.h>
using namespace std;
int main(int argc, char const *argv[])
{
int n;
int arr[1001];
cin >> n;
for (int i = 0; i < n; i++)
{
cin >> arr[i];
}
sort(a, a + n);
int res = 0;
for (int i = 0; i < n; i++)
res += abs(a[i] - a[n / 2]);
cout<<res<<endl;
return 0;
}
思路
- 在数轴上先sort
- 奇数个点,那么就是在所有数据的中位值
-
偶数个点,那么一定在最中间两个点之间
-
根据绝对值不等式$|x-a|+|x-b|\ge |a-b|$
- $(|a_1-x|+|a_n-x|)+(|a_2-x|+|a_{n-1}-x|)+\cdots$
- $\text{上式}\ge |a_n-a_1|+|a_{n-1}-a_2|$
- 等号成立的最优解是取中位数