【Acwing算法基础课】第六章贪心-绝对值不等式-104.货仓选址

题目: 104. 货仓选址 - AcWing题库

思路:

  1. 所有点排序

  2. 偶数个的时候, 货仓取到中间的两个点之间, 就能得到最小值

  3. 奇数个的时候, 货仓取到中位数就行

证明方法:

以上做法为什么是正确的呢? -- 运用了绝对值不等式:

        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]), 总结来看,不论是奇数还是偶数,计算的时候可以将货仓全部取中位数, 得到的都是最小值

题解: 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;
}

猜你喜欢

转载自blog.csdn.net/weixin_65293439/article/details/128462654