AcWing AC104

AcWing AC104

每日一题D1

URL:https://www.acwing.com/problem/content/106/

视频URL:https://www.bilibili.com/video/BV13T4y1N7sh

相似题目:https://www.acwing.com/problem/content/3130/

题面描述

在一条数轴上有 \(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;
}

思路

  1. 在数轴上先sort

    • 奇数个点,那么就是在所有数据的中位值
    • 偶数个点,那么一定在最中间两个点之间
  2. 根据绝对值不等式\(|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|\)
    • 等号成立的最优解是取中位数
posted @ 2021-02-21 11:14  SweepyZhou  阅读(83)  评论(0)    收藏  举报