AcWing AC104
AcWing AC104
每日一题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|\)
- 等号成立的最优解是取中位数