当前位置: 首页 > news >正文

【大厂机试题解法笔记】高效货运

老李是货运公司承运人,老李的货车额定载货重量为 wt。
现有两种货物:

  • 货物 A 单件重量为 wa,单件运费利润为 pa
  • 货物 B 单件重量为 wb,单件运费利润为 pb

老李每次发车时载货总重量刚好为货车额定的载货重量 wt,车上必须同时有货物 A 和货物 B ,货物A、B不可切割。
老李单次满载运输可获得的最高利润是多少?

输入描述

  • 第一列输入为货物 A 的单件重量 wa ,0 < wa < 10000
  • 第二列输入为货物 B 的单件重量 wb,0 < wb < 10000
  • 第三列输入为货车的额定载重 wt,0 < wt < 100000
  • 第四列输入为货物 A 的单件运费利润 pa,0 < pa < 1000
  • 第五列输入为货物 B 的单件运费利润 pb,0 < pb < 1000

输出描述
单次满载运输的最高利润

用例

输入输出
10 8 36 15 744
1 1 2 1 12

思考

总结题意:x > 0, y > 0,  x * wa + y * wb  = wt,x 和 y 分别表示货物 A  和 货物 B 的数量,求怎么分配 x 和 y 从而使 x * pa +  y * pb 最大。我觉得就是解二元一次方程,而且解(x、y)必须是正整数。设 f(x, y) = x * pa + y * pb ,因为 y = (wt - x * wa) / wb,所以 f(x, y) 转为一元一次方程:f(x) = pa * x + (wt - x * wa) / wb * pb = (pa - pb * wa / wb ) * x + pb * wt / wb。这个方程是一条直线,斜率 k = (pa - pb * wa / wb ), 根据 k 的正负可知 f(x) 是单调性。如果 k > =0,f (x) 单调递增(包括平行 x 轴),则 x 从 1 开始枚举,x 取值范围在 [1, Math.floor((wt - wb)/wa ],Math.floor((wt - wb)/wa 表示除去一个货物 B 的剩余载货空间下货物 A 能装载的最大数量。对于单调递增的情形,x 从最大值往最小值1枚举,每次计算对应的 y 值,如果y值是小数跳过继续迭代,直到找到 x 和 y 都是正整数,此时的 f(x) 最大,即满载货物 A 和 货物 B 的利润最大。对于 k < 0,单调递减函数的计算类似。记得初中数学课学过线性优化问题,这个题目应该就可以转化为线性优化问题。这种遍历枚举的方式比直接从1开始暴力枚举更新全局最大利润要好。 题目描述“老李每次发车时载货总重量刚好为货车额定的载货重量”应该表示输入数据不存在无解的情况,因此不需要考虑 x * wa + y * wb != wt 的无解情形。

算法思路

1. 问题建模与数学转化
  • 目标:在货车满载(总重量为 wt)且同时装载货物 A 和 B 的条件下,最大化运输利润。
  • 变量定义
    • x:货物 A 的数量(\(x > 0\),整数)
    • y:货物 B 的数量(\(y > 0\),整数)
  • 约束条件:\(x \cdot wa + y \cdot wb = wt\)
  • 利润函数:\(f(x, y) = x \cdot pa + y \cdot pb\)
  • 转化为一元函数:将 \(y = \frac{wt - x \cdot wa}{wb}\) 代入利润函数,得:\(f(x) = \left( pa - \frac{pb \cdot wa}{wb} \right) x + \frac{pb \cdot wt}{wb}\)
2. 单调性分析与枚举策略
  • 斜率计算:定义斜率 \(k = pa - \frac{pb \cdot wa}{wb}\),用于判断函数单调性:

    • 若 \(k \geq 0\),\(f(x)\) 随 x 增大而递增,应优先取最大可能的 x;
    • 若 \(k < 0\),\(f(x)\) 随 x 增大而递减,应优先取最小可能的 x。
  • 枚举范围确定

    • x 的最大值:\(\text{maxA} = \left\lfloor \frac{wt - wb}{wa} \right\rfloor\)(至少留 1 个 B 的重量,即 \(y \geq 1\));
    • x 的最小值:1(至少 1 个 A)。
3. 整数解筛选与利润计算
  • 递增情况(\(k \geq 0\)): 从 \(x = \text{maxA}\) 倒序枚举至 \(x = 1\),对每个 x 检查:\((wt - x \cdot wa) \% wb === 0\) 若成立,则 \(y = \frac{wt - x \cdot wa}{wb}\) 为整数,计算当前利润 \(f(x, y)\) 并返回(因函数递增,首个有效解即为最大值)。

  • 递减情况(\(k < 0\)): 从 \(x = 1\) 顺序枚举至 \(x = \text{maxA}\),对每个 x 检查同上条件,首个有效解即为最大值(因函数递减,最小 x 对应最大利润)。

4. 算法复杂度分析
  • 时间复杂度:最坏情况下需枚举 \(O(\frac{wt}{wa})\) 次,其中 \(wt < 10^5\),\(wa > 0\),故复杂度为 \(O(10^5)\),可高效求解。
  • 空间复杂度:仅使用常数级变量(\(x, y, k\) 等),复杂度为 \(O(1)\)。

参考代码

function solution() {const [wa, wb, wt, pa, pb] = readline().split(' ').map(Number);const k = pa - pb * wa / wb;// console.log("k: ", k);const maxA = Math.floor((wt-wb)/wa);// console.log('maxA: ', maxA);if (k >= 0) {for (let i = maxA; i >= 1; i--) {if ((wt - i*wa) % wb === 0) {console.log(i * pa + (wt - i*wa) / wb * pb);return;}}} for (let i = 1; i <= maxA; i++) {if ((wt - i*wa) % wb === 0) {console.log(i * pa + (wt - i*wa) / wb * pb);return;}}}const cases = [`10 8 36 15 7`,`1 1 2 1 1`
];let caseIndex = 0;
let lineIndex = 0;const readline = (function () {let lines = [];return function () {if (lineIndex === 0) {lines = cases[caseIndex].trim().split("\n").map((line) => line.trim());}return lines[lineIndex++];};
})();cases.forEach((_, i) => {caseIndex = i;lineIndex = 0;solution();
});

http://www.lryc.cn/news/574329.html

相关文章:

  • 互联网大数据求职面试:从Zookeeper到Flink的技术探讨
  • 跨越十年的C++演进:C++11新特性全解析
  • TCP客户端发送消息失败(NetAssist做客户端)
  • 【C++】第十二节——详解list(上)—(list的介绍和使用、模拟实现)
  • Origin绘制三Y轴柱状图、点线图、柱状点线图
  • el-cascader 设置可以手动输入也可以下拉选择
  • 原生微信小程序网络请求与上传接口封装实战指南
  • 【DeepSeek实战】2、DeepSeek特训:Function Calling与ReAct双引擎驱动大模型智能升级实战指南
  • 《高等数学》(同济大学·第7版)第六章 定积分的应用 第一节定积分的元素法
  • matlab实现大地电磁二维正演
  • 音视频全链路开发实践:基于SmartMediakit的架构设计与应用实战
  • Recent Advances in Speech Language Models: A Survey
  • 通信网络编程3.0——JAVA
  • 【信创-k8s】银河麒麟V10国防版+鲲鹏/飞腾(arm64架构)在线/离线部署k8s1.30+kubesphere
  • fiddler+安卓模拟器,解决无网络、抓不到https问题
  • 网络安全之某cms的漏洞分析
  • 阿里云Elasticsearch生产环境误删数据恢复指南
  • 将RESP.app的备份数据转码成AnotherRedisDesktopManager的格式
  • 越南数学家吴宝珠恶搞式证明朗兰兹纲领
  • 基于SpringBoot + Vue 的网上拍卖系统
  • ESXi 8 相较于 ESXi 7 升级
  • 【C++】哈希表的实现(链地址法)
  • Linux切换中文输入法
  • SpringCloud系列(32)--使用Hystrix进行全局服务降级
  • STM32对接霍尔传感器
  • Vibe Coding - 使用cursor从PRD到TASK精准分解执行
  • 第十六届蓝桥杯C/C++程序设计研究生组国赛 国二
  • Vue按键事件
  • ​​根系杂种优势的分子解码:SPE基因互补与进化可塑性的协同效应​​
  • 电路图识图基础知识-塔式起重机控制电路识图与操作要点(三十五)