一、题目链接
AcWing 104. 货仓选址
进阶题目 AcWing 122. 糖果传递
二、题目分析
(一)算法标签
贪心 排序 快速选择算法 绝对值不等式
(二)解题思路
要使
∣
x
−
a
1
∣
+
∣
x
−
a
2
∣
+
∣
x
−
a
3
∣
+
⋯
+
∣
x
−
a
n
−
1
∣
+
∣
x
−
a
n
∣
\vert x-a_1 \vert + \vert x-a_2\vert+\vert x-a_3 \vert+ \dots +\vert x-a_{n-1} \vert+\vert x-a_n \vert
∣x−a1∣+∣x−a2∣+∣x−a3∣+⋯+∣x−an−1∣+∣x−an∣最小
x
x
x要取
c
1
,
c
2
,
⋯
,
c
n
c_1,c_2,\cdots,c_n
c1,c2,⋯,cn的中位数
即:
先对a数组进行排序sort(a+1,a+1+n);
x
=
a
[
1
+
n
2
]
x=a[\frac{1+n}2]
x=a[21+n]
三、AC代码
解法一:
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 1e5 + 10;
typedef long long LL;
int a[N];
int n;
int main()
{
cin >> n;
for (int i = 1; i <= n; i ++ )
{
scanf("%d", &a[i]);
}
sort(a + 1, a + 1 + n);
int t = a[1 + n >> 1];
LL sum = 0;
for (int i = 1; i <= n; i ++ )
sum += abs(a[i] - t);
cout << sum << endl;
return 0;
}