每日一题:两个仓库的最低配送费用问题

news2025/5/11 11:47:19

文章目录

  • 两个仓库的最低配送费用问题
    • 一、问题描述
    • 二、解题思路
      • (一)初始假设
      • (二)差值定义
      • (三)选择最优
      • (四)计算答案
    • 三、代码实现
    • 四、代码分析
      • (一)输入处理
      • (二)初始费用计算
      • (三)差值计算与排序
      • (四)选择最小差值并计算额外费用
      • (五)输出结果
    • 五、总结

两个仓库的最低配送费用问题

一、问题描述

某公司有 2 个仓库(用 A 和 B 表示),需要给 m 个营业网点(m 为偶数)各配送一件货物。每个仓库正好有 m/2 件货物。配送给不同营业网点的费用使用一个二维数组 cost 表示,其中 cost[i] = [Ai, Bi] 表示第 i 个营业网点从 A 仓发货的运费为 Ai,从 B 仓库发货的费用为 Bi。任务是计算 m 件货物配送的最低费用,要求每个营业网点都有一件货物送到。

二、解题思路

(一)初始假设

若全部从仓库 A 发货,则总费用为 (\sum_{i=1}^{m} A_i)。

(二)差值定义

将第 i 个网点改为从 B 发货,相当于在全部发自 A 的基准上“多花” (\Delta_i = B_i - A_i) 的费用。

(三)选择最优

需要有且仅有 m/2 件货物由 B 发货。为了使额外总费用最小,应当选取最小的 m/2 个 (\Delta_i)(即最负或最小的那些差值)去改由 B 发货。

(四)计算答案

  1. 计算全部从 A 发货的初始费用。
  2. 计算每个网点从 B 发货相对于从 A 发货的差值。
  3. 对差值进行排序,选择最小的 m/2 个差值对应的网点从 B 发货。
  4. 将这些最小差值累加到初始费用上,得到最终的最低总费用。

三、代码实现

#include <bits/stdc++.h> // 包含了 C++ 标准库中的大部分头文件,方便使用各种功能
using namespace std;     // 使用标准命名空间,避免每次调用标准库函数或对象时都要加 std::

int main() {
    int m; // 定义变量 m,表示营业网点的数量
    cin >> m; // 从标准输入读取 m 的值
    string line; // 定义一个字符串变量 line,用于存储输入的数组字符串

    // 读取第二行的数组字符串
    getline(cin, line); // 读取并丢弃之前读取 m 后的换行符
    getline(cin, line); // 真正读取包含成本数据的行

    vector<pair<int, int>> cost; // 定义一个向量,用于存储每个营业网点从 A 和 B 仓库发货的费用
    vector<int> nums; // 定义一个向量,用于存储从输入字符串中提取的所有整数
    int num = 0; // 定义一个变量 num,用于临时存储当前正在解析的数字
    bool inNum = false; // 定义一个布尔变量 inNum,用于标记是否正在解析一个数字

    // 遍历输入的字符串,提取所有整数
    for (char c : line) { // 遍历字符串中的每个字符
        if (isdigit(c)) { // 如果当前字符是数字
            num = num * 10 + (c - '0'); // 将当前字符转换为数字并累加到 num 中
            inNum = true; // 标记正在解析一个数字
        } else if (inNum) { // 如果当前字符不是数字,但之前正在解析一个数字
            nums.push_back(num); // 将解析完成的数字存储到 nums 向量中
            num = 0; // 重置 num 为 0,准备解析下一个数字
            inNum = false; // 重置 inNum 为 false,表示当前不再解析数字
        }
    }
    if (inNum) nums.push_back(num); // 如果字符串末尾是一个数字,将其存储到 nums 向量中

    // 两两配对成 cost[i]
    for (int i = 0; i < nums.size(); i += 2) { // 遍历 nums 向量,每次跳过两个元素
        cost.emplace_back(nums[i], nums[i + 1]); // 将每两个连续的数字作为一对,存储到 cost 向量中
    }

    // 1. 计算全部从 A 发货的初始费用
    long long sumA = 0; // 定义一个变量 sumA,用于存储全部从 A 发货的总费用
    for (auto &p : cost) { // 遍历 cost 向量
        sumA += p.first; // 将每个营业网点从 A 仓库发货的费用累加到 sumA 中
    }

    // 2. 计算差值数组 Δ[i] = B_i - A_i
    vector<int> diff; // 定义一个向量,用于存储每个营业网点从 B 发货相对于从 A 发货的差值
    for (auto &p : cost) { // 遍历 cost 向量
        diff.push_back(p.second - p.first); // 计算差值并存储到 diff 向量中
    }

    // 3. 对差值排序,取最小的 m/2 个
    sort(diff.begin(), diff.end()); // 对 diff 向量进行升序排序
    long long extra = 0; // 定义一个变量 extra,用于存储额外的费用
    for (int i = 0; i < m / 2; ++i) { // 遍历 diff 向量的前 m/2 个元素
        extra += diff[i]; // 将最小的 m/2 个差值累加到 extra 中
    }

    // 4. 输出最小总费用
    cout << (sumA + extra) << endl; // 将初始费用 sumA 和额外费用 extra 相加,输出最终的最低总费用

    return 0; // 程序正常结束,返回 0
}

四、代码分析

(一)输入处理

  • 使用 getline 读取包含成本数据的行,并通过逐字符判断来提取其中的数字,将其存入 nums 向量。
  • 然后将 nums 中的数字两两配对,形成 cost 向量,其中每个元素是一个包含两个整数的 pair,分别表示从 A 仓库和 B 仓库发货到对应营业网点的费用。

(二)初始费用计算

  • 遍历 cost 向量,将每个网点从 A 仓库发货的费用累加,得到全部从 A 发货的初始总费用 sumA

(三)差值计算与排序

  • 遍历 cost 向量,计算每个网点从 B 仓库发货相对于从 A 仓库发货的差值,并将这些差值存入 diff 向量。
  • diff 向量进行排序,以便后续选择最小的 m/2 个差值。

(四)选择最小差值并计算额外费用

  • 遍历排序后的 diff 向量的前 m/2 个元素,将这些最小差值累加到 extra 中,extra 表示从 A 仓库发货改为从 B 仓库发货带来的额外费用。

(五)输出结果

  • 将初始费用 sumA 与额外费用 extra 相加,得到最终的最低总费用,并输出。

五、总结

本题通过巧妙地利用差值和排序,将问题转化为选择最小的 m/2 个差值来最小化额外费用,从而高效地求解出最低配送费用。这种方法不仅思路清晰,而且时间复杂度较低,适合处理大规模数据。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2373090.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

华为私有协议Hybrid

实验top图 理论环节 1. 基本概念 Hybrid接口&#xff1a; 支持同时处理多个VLAN流量&#xff0c;且能针对不同VLAN配置是否携带标签&#xff08;Tagged/Untagged&#xff09;。 核心特性&#xff1a; 灵活控制数据帧的标签处理方式&#xff0c;适用于复杂网络场景。 2. 工作…

数据库实验10

设计性实验 1&#xff0e;实验要求 1.编写函数FsumXXX&#xff0c;1~n&#xff08;参数&#xff09;求和&#xff1b; GO CREATE FUNCTION Fsum065 (n INT) RETURNS INT AS BEGIN DECLARE sum INT 0 WHILE n > 0 BEGIN SET sum sum n SET n n - 1 END RETURN sum END …

jflash下载时出现 Could not read unit serial number! 的解决方法

出现的原因是由于Jlink原厂固件SN码是-1 我用的版本是v6.40 解决方法&#xff1a;添加序列号 1.打开&#xff1a;J-Link commander 之后在命令栏输入&#xff1a;exec setsnxxxxxxxx 2.添加序列号到license&#xff0c;打开J-Link License Manager V6.40 jlink-v640下载软件…

Linux 信号终篇(总结)

前文&#xff1a;本文是对信号从产生到被处理的过程中的概念和原理的总结&#xff0c;如果想了解具体实现&#xff0c;请查看前两篇博客&#xff1a;Linux 信号-CSDN博客、Linux 信号&#xff08;下篇&#xff09;-CSDN博客 一、信号的产生 1.1 信号产生的五种条件 ①键盘组…

LVGL对象(Objects)

文章目录 &#x1f9f1; 一、LVGL 中的对象&#xff08;lv\_obj&#xff09;&#x1f539; lv\_obj\_t 的作用 &#x1f9e9; 二、对象的分类结构&#xff08;类比继承&#xff09;&#x1f9f0; 三、对象的创建与销毁✅ 创建对象示例&#xff1a;创建一个按钮❌ 删除对象 &…

服务器配置错误导致SSL/TLS出现安全漏洞,如何进行排查?

SSL/TLS 安全漏洞排查与修复指南 一、常见配置错误类型‌ 弱加密算法与密钥问题‌ 使用弱密码套件&#xff08;如DES、RC4&#xff09;或密钥长度不足&#xff08;如RSA密钥长度<2048位&#xff09;&#xff0c;导致加密强度不足。 密钥管理不当&#xff08;如私钥未加密存…

路由重发布

路由重发布 实验目标&#xff1a; 掌握路由重发布的配置方法和技巧&#xff1b; 掌握通过路由重发布方式实现网络的连通性&#xff1b; 熟悉route-pt路由器的使用方法&#xff1b; 实验背景&#xff1a;假设学校的某个分区需要配置简单的rip协议路由信息&#xff0c;而主校…

C++修炼:stack和queue

Hello大家好&#xff01;很高兴我们又见面啦&#xff01;给生活添点passion&#xff0c;开始今天的编程之路&#xff01; 我的博客&#xff1a;<但凡. 我的专栏&#xff1a;《编程之路》、《数据结构与算法之美》、《题海拾贝》、《C修炼之路》 欢迎点赞&#xff0c;关注&am…

【计算机视觉】优化MVSNet可微分代价体以提高深度估计精度的关键技术

优化MVSNet可微分代价体以提高深度估计精度的关键技术 1. 代价体基础理论与分析1.1 标准代价体构建1.2 关键问题诊断 2. 特征表示优化2.1 多尺度特征融合2.2 注意力增强匹配 3. 代价体构建优化3.1 自适应深度假设采样3.2 可微分聚合操作改进 4. 正则化与优化策略4.1 多尺度代价…

软考错题集

一个有向图具有拓扑排序序列&#xff0c;则该图的邻接矩阵必定为&#xff08;&#xff09;矩阵。 A.三角 B.一般 C.对称 D.稀疏矩阵的下三角或上三角部分包含非零元素&#xff0c;而其余部分为零。一般矩阵这个术语太过宽泛&#xff0c;不具体指向任何特定性 质的矩阵。对称矩阵…

T2I-R1:通过语义级与图像 token 级协同链式思维强化图像生成

文章目录 速览摘要1 引言2 相关工作统一生成与理解的 LMM(Unified Generation and Understanding LMM.)用于大型推理模型的强化学习(Reinforcement Learning for Large Reasoning Models.)3 方法3.1 预备知识3.2 语义级与令牌级 CoT语义级 CoT(Semantic-level CoT)令牌级…

Dockers部署oscarfonts/geoserver镜像的Geoserver

Dockers部署oscarfonts/geoserver镜像的Geoserver 说实话&#xff0c;最后发现要选择合适的Geoserver镜像才是关键&#xff0c;所以所以所以…&#x1f437; 推荐oscarfonts/geoserver的镜像&#xff01; 一开始用kartoza/geoserver镜像一直提示内存不足&#xff0c;不过还好…

扩增子分析|微生物生态网络稳定性评估之鲁棒性(Robustness)和易损性(Vulnerability)在R中实现

一、引言 周集中老师团队于2021年在Nature climate change发表的文章&#xff0c;阐述了网络稳定性评估的原理算法&#xff0c;并提供了完整的代码。自此对微生物生态网络的评估具有更全面的指标&#xff0c;自此网络稳定性的评估广受大家欢迎。本系列将介绍网络稳定性之鲁棒性…

【含文档+PPT+源码】基于微信小程序的社区便民防诈宣传系统设计与实现

项目介绍 本课程演示的是一款基于微信小程序的社区便民防诈宣传系统设计与实现&#xff0c;主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的 Java 学习者。 1.包含&#xff1a;项目源码、项目文档、数据库脚本、软件工具等所有资料 2.带你从零开始部署运行本套…

【MySQL】存储引擎 - ARCHIVE、BLACKHOLE、MERGE详解

&#x1f4e2;博客主页&#xff1a;https://blog.csdn.net/2301_779549673 &#x1f4e2;博客仓库&#xff1a;https://gitee.com/JohnKingW/linux_test/tree/master/lesson &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01; &…

代码随想录第41天:图论2(岛屿系列)

一、岛屿数量&#xff08;Kamacoder 99&#xff09; 深度优先搜索&#xff1a; # 定义四个方向&#xff1a;右、下、左、上&#xff0c;用于 DFS 中四向遍历 direction [[0, 1], [1, 0], [0, -1], [-1, 0]]def dfs(grid, visited, x, y):"""对一块陆地进行深度…

VUE CLI - 使用VUE脚手架创建前端项目工程

前言 前端从这里开始&#xff0c;本文将介绍如何使用VUE脚手架创建前端工程项目 1.预准备&#xff08;编辑器和管理器&#xff09; 编辑器&#xff1a;推荐使用Vscode&#xff0c;WebStorm&#xff0c;或者Hbuilder&#xff08;适合刚开始练手使用&#xff09;&#xff0c;个…

Java EE初阶——初识多线程

1. 认识线程 线程是操作系统能够进行运算调度的最小单位。它被包含在进程之中&#xff0c;是进程中的实际运作单位。 基本概念&#xff1a;一个进程可以包含多个线程&#xff0c;这些线程共享进程的资源&#xff0c;如内存空间、文件描述符等&#xff0c;但每个线程都有自己独…

如何删除网上下载的资源后面的文字

这是我在爱给网上下载的音效资源&#xff0c;但是发现资源后面跟了一大段无关紧要的文本&#xff0c;但是修改资源名称后还是有。解决办法是打开属性然后删掉资源的标签即可。

FPGA图像处理(5)------ 图片水平镜像

利用bram形成双缓冲&#xff0c;如下图配置所示&#xff1a; wr_flag 表明 buffer0写 还是 buffer1写 rd_flag 表明 buffer0读 还是 buffer1读 通过写入逻辑控制(结合wr_finish) 写哪个buffer &#xff1b;写地址 进而控制ip的写使能 通过状态缓存来跳转buffer的…