题解:洛谷 P10452 货仓选址

【题目来源】

洛谷:P10452 货仓选址 - 洛谷

【题目描述】

在一条数轴上有 \(N\) 家商店,它们的坐标分别为 \(A_1 \sim A_N\)

现在需要在数轴上建立一家货仓,每天清晨,从货仓到每家商店都要运送一车商品。

为了提高效率,求把货仓建在何处,可以使得货仓到每家商店的距离之和最小。

【输入】

第一行输入整数 \(N\)

第二行 \(N\) 个整数 \(A_1 \sim A_N\)

【输出】

输出一个整数,表示距离之和的最小值。

【输入样例】

4
6 2 9 1

【输出样例】

12

【算法标签】

《洛谷 P10452 货仓选址》 #贪心# #排序#

【代码详解】

#include <bits/stdc++.h>
using namespace std;

const int MAX_N = 100005;  // 定义数组最大长度
int n;                     // 数字个数
int a[MAX_N];              // 存储数字的数组
int ans;                   // 存储最终结果(总距离和)

int main()
{
    // 输入数字个数
    cin >> n;
    
    // 输入所有数字
    for (int i = 0; i < n; i++)
        cin >> a[i];
    
    // 对数组进行排序(升序)
    sort(a, a + n);
    
    // 计算所有数字到中位数的距离之和
    for (int i = 0; i < n; i++)
        ans += abs(a[i] - a[n / 2]);  // 累加每个数字与中位数的绝对差
    
    // 输出结果
    cout << ans;
    
    return 0;
}
// 按照起始下标从1开始重新写一遍
#include <bits/stdc++.h>
using namespace std;

const int MAX_N = 100005;  // 定义数组最大长度
int n;                     // 数字个数
int a[MAX_N];              // 存储数字的数组(从1开始索引)
int ans;                   // 存储最终结果(总距离和)

int main()
{
    // 输入数字个数
    cin >> n;
    
    // 输入所有数字(从1开始存储)
    for (int i = 1; i <= n; i++)
        cin >> a[i];
    
    // 对数组进行排序(升序,从a[1]到a[n])
    sort(a + 1, a + n + 1);
    
    // 计算所有数字到中位数的距离之和
    for (int i = 1; i <= n; i++)
        ans += abs(a[i] - a[(n + 1) / 2]);  // 累加每个数字与中位数的绝对差
    
    // 输出结果
    cout << ans;
    
    return 0;
}

【运行结果】

4
6 2 9 1
12
posted @ 2026-03-17 15:30  团爸讲算法  阅读(1)  评论(0)    收藏  举报