绝对值不等式——AcWing 104. 货仓选址

绝对值不等式

定义

与数学中的绝对值不等式定义一致,即含有绝对值符号的不等式。

运用情况

  • 在一些需要根据数值与特定值的距离关系来进行判断和处理的算法中。
  • 用于对数据范围进行约束和界定。

注意事项

  • 确保对绝对值的处理正确,尤其是在复杂的逻辑中。
  • 注意数据类型的精度和范围,避免溢出等问题。

解题思路

  • 可以直接按照数学中绝对值不等式的解题方法进行分析和处理。
  • 结合 C++的语法特点和数据结构来实现具体的算法逻辑。
    例如,在一个排序算法中,可能需要根据元素与某个基准值的绝对值距离来进行特定操作。可以先计算出绝对值,然后根据不等式关系进行判断和相应的处理。在代码实现过程中,要注意代码的简洁性和效率。同时,对于可能出现的边界情况和特殊值要进行充分的测试和验证,以确保算法的正确性和稳定性。

AcWing 104. 货仓选址 

题目描述

104. 货仓选址 - AcWing题库

运行代码

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
    int n;
    cin >> n;
    vector<int> lo(n);
    for (int i = 0; i < n; i++) {
        cin >> lo[i];
    }
    sort(lo.begin(), lo.end());
    int mid = n / 2;
    int min = 0;
    for (int i = 0; i < n; i++) {
        min += abs(lo[i] - lo[mid]);
    }
    cout << min<< endl;
    return 0;
}

代码思路

  • 首先,定义了变量 n 用于接收商店的数量。
  • 然后,创建一个 vector<int> 类型的 lo 来存储商店的坐标。通过循环读入每个商店的坐标。
  • 接着,对商店坐标进行排序,这是后续计算的重要准备步骤。
  • 计算中间位置索引 mid ,这里假设将货仓建在中间位置可能是距离之和较小的一个选择。
  • 然后通过一个循环,计算每个商店到中间位置的距离的绝对值之和,并累加到 min 中。
  • 最后输出这个最小距离之和。

改进思路

  1. 使用更高效的数据结构:在代码中,可以使用合适的数据结构来存储商店的坐标,以便更快地进行排序和计算。例如,可以使用二叉搜索树或平衡二叉树来代替数组,这样可以提高查找和插入的效率。
  2. 优化排序算法:对商店坐标进行排序是算法的一个关键步骤。可以考虑使用更高效的排序算法,如快速排序或归并排序,以减少排序的时间复杂度。
  3. 利用中位数的性质:根据中位数的定义,货仓建在中位数的位置可以使距离之和最小。可以进一步利用中位数的性质,避免不必要的计算。例如,在排序后,可以直接找到中位数,而不需要扫描整个数组来计算距离之和。
  4. 考虑并行计算:如果数据量较大,可以考虑使用并行计算技术,将计算任务分配到多个线程或进程中,以加快计算速度。
  5. 使用更高效的编程语言或库:选择一种高效的编程语言,并使用其提供的优化库和函数,可能会对算法的性能产生积极影响。
  6. 进行性能测试和分析:在优化过程中,进行性能测试和分析是很重要的。可以使用性能分析工具来测量算法的运行时间和内存使用情况,找出性能瓶颈,并针对性地进行优化。

改进代码

#include <iostream>
#include <vector>
#include <algorithm>
#include <cmath>
using namespace std;
int main() {
    int n;
    cin >> n;
   vector<int> lo(n);
    for (int i = 0; i < n; i++) {
       cin >> lo[i];
    }
    sort(lo.begin(), lo.end());
    int mid = n / 2;
    if (n % 2 == 0) {  // 若数量为偶数,考虑中间两个位置
        int dist1 = 0, dist2 = 0;
        for (int i = 0; i < n; i++) {
            dist1 += abs(lo[i] - lo[mid - 1]);
            dist2 += abs(lo[i] - lo[mid]);
        }
        cout << min(dist1, dist2) << endl;
    } else {
        int min = 0;
        for (int i = 0; i < n; i++) {
            min += abs(lo[i] - lo[mid]);
        }
        cout << min << endl;
    }
    return 0;
}

其它代码

#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;
const int N = 100010;
int a[N];
int main()
{
    int n; cin >> n;
    for(int i = 1; i <= n; i++) cin >> a[i];
    sort(a + 1, a + n + 1);
    int ans = 0, d = a[n / 2 + 1];
    for(int i = 1; i <= n; i++) ans += abs(a[i] - d);
    cout << ans << endl;
    return 0;
}

代码思路

  • 首先定义了一个较大的常量 N 表示可能的最大数据规模。
  • 定义了数组 a 来存储商店的坐标。
  • 在 main 函数中,先输入商店的数量 n ,然后通过循环读入每个商店的坐标并存入数组 a 。
  • 接着对数组进行排序,这是为了找到一个相对中间的位置。
  • 计算出中间位置(或偏中间位置)对应的坐标值 d 。
  • 然后通过循环计算每个商店坐标与 d 的距离的绝对值,并累加到结果 ans 中。最后输出这个总的距离和。
  • 40
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

筱姌

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值