思路:
-
所有点排序
-
偶数个的时候, 货仓取到中间的两个点之间, 就能得到最小值
-
奇数个的时候, 货仓取到中位数就行
证明方法:
以上做法为什么是正确的呢? -- 运用了绝对值不等式:
f(x) =|xn - x| + |xn-1 - x| + |xn-2 - x| + ... |x1-x|
>= |xn - x1| + |xn-1 - x2| + ...
最小值就是 xn - x1 + xn-1 - x2 + ...
奇数就是取中位数, 偶数就是中间的两个点之间, 也可以是中位数(a[n/2]), 总结来看,不论是奇数还是偶数,计算的时候可以将货仓全部取中位数, 得到的都是最小值
扫描二维码关注公众号,回复:
17258691 查看本文章
题解: AcWing 104. 货仓选址(寒假每日一题) - AcWing
如果不懂的话可以看视频,特别清晰
代码:
#include <iostream>
#include <algorithm>
//贪心 绝对值不等式 104.货仓选址
using namespace std;
const int N = 100010;
int n;
int a[N];
int main()
{
scanf("%d", &n);//输入点个数
for(int i = 0; i < n; i++) scanf("%d", &a[i]);//输入点坐标
sort(a, a + n);
int res = 0;
for(int i = 0; i < n; i++) res += abs(a[i] - a[n / 2]);//循环n个, |a[i] - 中位数|
printf("%d\n", res);
return 0;
}