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

【华为OD机试真题】任务编排系统 · 双任务时长组合问题(Python/JS)

一、题目描述📝

题目描述:

任务编排服务负责对任务进行组合调度。参与编排的任务有两种类型,其中一种执行时长为taskA,另一种执行时长为taskB。任务一旦开始执行不能被打断,且任务可连续执行。服务每次可以编排num个任务。请编写一个方法,生成每次编排后的任务所有可能的总执行时长。

输入描述:

第1行输入分别为第1种任务执行时长taskA,第2种任务执行时长taskB,这次要编排的任务个数num,以逗号分隔。

输出描述:

数组形式返回所有总执行时时长,需要按从小到大排列。

补充说明:

每种任务的数量都大于本次可以编排的任务数量。

0<taskA

0<taskB

0<=num<=100000

示例1

输入:

1,2,3

输出:

[3, 4, 5, 6]

说明:

可以执行3次taskA,得到结果3,执行2次taskA和次taskB,得到结果4。以此类推,得到最终结果。

二、解题思路深度解析

1. 数学建模:线性方程

设选择任务A的数量为 ii ,则任务B的数量必然为 num−i 。
其中 ii 的取值范围为整数 [0,num]。

总时长 T 的计算公式为:

T(i)=i×taskA+(num−i)×taskB

化简得:

T(i)=i×(taskA−taskB)+num×taskB

2. 核心逻辑

  • 枚举法:由于 i 的取值是连续的整数 0,1,...,num ,我们只需要遍历这 num+1 种情况,计算出对应的 T(i) 即可。
  • 去重问题
    • 若 taskA≠taskB ,则 T(i) 是关于 i 的严格单调函数,所有 num+1个结果互不相同。
    • 若 taskA==taskB ,则所有结果都相等,集合中只有一个值。
    • 结论:直接计算所有 ii 对应的值,放入列表,然后排序即可 naturally 处理重复(如果有重复值,排序后相邻,题目通常要求列出所有可能值,若理解为“集合”则需去重,但根据示例和常规OD题意,通常指所有组合产生的结果集合。若 taskA=taskBtaskA=taskB ,结果列表应为[X, X, ..., X]还是[X]
    • 修正:题目问的是“所有可能的总执行时长”。如果 A=B=2,num=3 ,无论怎么组合,总时长都是 6。那么“可能的总时长”只有一种情况,即6
    • 关键点:如果 taskA==taskB ,结果应该去重,只保留一个值。如果 taskA≠taskB ,则所有值都不同。
    • 通用策略:计算所有值 -> 放入 Set 去重 -> 转 List 排序。这样最稳妥。

3. 算法步骤

  1. 解析输入:分割字符串,转为整数。
  2. 遍历计算:循环 i 从 0 到 num ,计算 T=i×A+(num−i)×B 。
  3. 去重与排序:使用集合(Set)去除重复值(针对 A=B 的情况),然后转换为列表并排序。
  4. 格式化输出:按要求输出数组字符串。

4. 复杂度分析

  • 时间复杂度: O(Nlog⁡N) (主要在于排序,若利用单调性可优化至 O(N)。对于 N=105 ,完全可接受。
  • 空间复杂度: O(N) 存储结果。

三、Code实现

1、Python 语言✅️

Python 代码简洁有力,利用set自动去重,sorted轻松排序。

import sys def solve(): # 读取输入 try: line = sys.stdin.readline() if not line: return parts = line.strip().split(',') if len(parts) != 3: return task_a = int(parts[0]) task_b = int(parts[1]) num = int(parts[2]) # 使用集合去重(处理 taskA == taskB 的情况) possible_durations = set() # 遍历 A 的数量 i 从 0 到 num # 优化:直接利用公式计算 for i in range(num + 1): total_time = i * task_a + (num - i) * task_b possible_durations.add(total_time) # 排序 result = sorted(list(possible_durations)) # 格式化输出 [3, 4, 5, 6] # 注意:题目示例中逗号后有空格 print("[" + ", ".join(map(str, result)) + "]") except Exception as e: # 异常处理,防止运行时错误 return if __name__ == "__main__": solve()

💡 Python 代码亮点

  1. 自动去重:使用set()存储结果,完美解决 A=B 时结果重复的问题。
  2. 简洁排序sorted()函数直接返回有序列表。
  3. 格式化输出", ".join(map(str, result))快速构建符合要求的字符串。
  4. 鲁棒性:加入try-except和输入检查,防止空行或格式错误导致崩溃。

2、JavaScript ✅️

JS 在机考中需注意异步输入处理和数组操作。

const readline = require('readline'); const rl = readline.createInterface({ input: process.stdin, output: process.stdout }); rl.on('line', (line) => { if (!line.trim()) return; const parts = line.split(','); if (parts.length !== 3) return; const taskA = parseInt(parts[0].trim(), 10); const taskB = parseInt(parts[1].trim(), 10); const num = parseInt(parts[2].trim(), 10); // 使用 Set 去重 const durationSet = new Set(); // 遍历计算 for (let i = 0; i <= num; i++) { const total = i * taskA + (num - i) * taskB; durationSet.add(total); } // 转数组并排序 (数字排序需传入比较函数) const result = Array.from(durationSet).sort((a, b) => a - b); // 格式化输出 // JS 的 join 默认逗号无空格,需手动处理或 replace const outputStr = "[" + result.join(", ") + "]"; console.log(outputStr); rl.close(); });

💡 JavaScript 代码亮点

  1. Set 数据结构:ES6 的Set天然去重,逻辑清晰。
  2. 数字排序陷阱:JS 默认的sort()是按字典序(字符串)排序的(如10会排在2前面)。必须传入(a, b) => a - b进行数值排序。
  3. 输入处理:使用readline模块标准处理单行输入,trim()去除潜在空格。
  4. 输出格式join(", ")确保逗号后有空格,符合题目示例格式。

五、进阶优化:利用单调性 ( O(N) )🔍

虽然排序很快,但如果我们想展示更强的算法功底,可以利用数学性质免去排序和去重步骤

推导
T(i)=i×(A−B)+num×B

  • 情况 1: A>B
    • 系数 (A−B)>0 ,函数单调递增。
    • ii 从 0→num ,结果天然升序。
    • 结果数量:若 A≠B ,有 num+1 个;若 A=B ,有 1 个。
  • 情况 2: A<B
    • 系数 (A−B)<0( ,函数单调递减。
    • ii 从 0→num ,结果降序。
    • 策略:让 i 从 num→0 遍历,结果即天然升序。
  • 情况 3: A=B
    • 结果恒为 num×A 。
    • 策略:直接输出[num * A]

优化后的 Python 逻辑片段

result = [] if task_a == task_b: result = [num * task_a] elif task_a > task_b: # A > B, i 增大,总值增大。正序遍历 0->num for i in range(num + 1): result.append(i * task_a + (num - i) * task_b) else: # A < B, i 增大,总值减小。倒序遍历 num->0 以获得升序 for i in range(num, -1, -1): result.append(i * task_a + (num - i) * task_b) # 此时 result 已经是有序且无重复的,无需 sort 和 set

注:这种写法将复杂度严格降低到 O(N) ,在 N 极大时优势明显,是面试中的加分项。


六、避坑指南⚠️

  1. 数字排序误区 (JS)
    • ❌ 错误:[10, 2].sort()结果是[10, 2]
    • ✅ 正确:[10, 2].sort((a, b) => a - b)结果是[2, 10]
  2. 去重逻辑
    • 很多同学忽略 A=B 的情况,输出了[6, 6, 6, 6]。题目问的是“可能的总时长”,语义上指值的集合,应去重为[6]。使用Set是最安全的做法。
  3. 输出格式细节
    • 仔细观察示例[3, 4, 5, 6],逗号后面有一个空格
    • Python:", ".join(...)
    • JS:join(", ")
    • 漏掉空格可能导致格式校验失败。
  4. 大数溢出
    • 虽然 Python 和 JS (ES2020+) 对大数支持较好,但在极端情况下( num=105,task=109 ),结果达 1014 。
    • Python 自动处理大整数,无需担心。
    • JS 中 1014 仍在Number(双精度浮点) 的安全整数范围 (253≈9×1015 ) 内,无需BigInt,但需注意精度问题(本题纯整数运算,安全)。

七、总结🎯

这道题是典型的“数学规律 + 基础模拟”类题目。

  • 核心:识别出总时长与任务数量呈线性关系。
  • 技巧:利用Set去重处理边界情况,利用单调性优化排序。
  • 语言特性
    • Python:语法糖丰富,处理数学问题得心应手。
    • JavaScript:需注意数字排序的比较函数,ES6Set让去重变得简单。

掌握这种从数学公式出发,结合语言特性优化的思维方式,是攻克华为OD及其他大厂机考的关键。

觉得有用?欢迎点赞、收藏、关注,获取更多华为OD机试真题全语言解析!

http://www.jsqmd.com/news/509249/

相关文章:

  • MCP4261数字电位器驱动库:SPI通信、EEPROM存储与嵌入式应用
  • Kinova机械臂远程操控新玩法:用GRU-VAE模型实现手势到动作的秒级转换
  • Snipe-IT:开源IT资产管理系统的创新实践指南
  • 惊艳效果:UNIT-00自动生成Python数据分析完整脚本与报告
  • 2026高端装修新风向:深度测评五家引领“制造型半包”趋势的实力服务商 - 2026年企业推荐榜
  • SSVXYMatrix:嵌入式XY坐标LED矩阵驱动框架
  • Qwen-Image-2512-SDNQ WebUI用户体验优化:进度条动画+生成耗时预估提示
  • Shadow Sound Hunter与SolidWorks集成:智能设计辅助
  • Stable Diffusion XL 1.0镜像免配置优势:灵感画廊预装diffusers 0.27+优化版本
  • Mathtype公式编辑与AI结合:百川2-13B辅助识别与生成数学公式
  • 【华为OD机试真题】任务编排系统 · 双任务时长组合问题(C语言)
  • 2026年自动封口机选购指南:五大信誉厂家深度解析与推荐 - 2026年企业推荐榜
  • P8651 [蓝桥杯 2017 省 B] 日期问题【日期计算+排序】
  • Cosmos-Reason1-7B部署案例:消费级GPU(RTX 4090/3090)FP16高效推理
  • RT-Thread线程管理:动态/静态创建与生命周期控制
  • 2026长沙推拿足浴消费指南:五大品牌深度解析与选购建议 - 2026年企业推荐榜
  • 2026年温州休闲运动鞋制造深度解析:五家做工精湛的实力厂家横向评测 - 2026年企业推荐榜
  • 银河麒麟系统下Miniconda安装避坑指南:解决Permission denied错误
  • 轻量级嵌入式任务调度框架cola_os设计与实践
  • Seed-Coder-8B-Base微调实战:用公司代码库训练专属AI程序员
  • 2026年高端家装市场:五家报价透明、设计卓越的室内设计公司深度解析 - 2026年企业推荐榜
  • 三种经典恒流源电路原理、性能对比与工程选型指南
  • LumiPixel Canvas Quest光影大师:复杂光源环境下的人像生成效果测评
  • Qwen-Image定制镜像完整指南:RTX4090D环境下高效加载与推理Qwen-VL
  • GLM-4.6V-Flash-WEB效果实测:多语言界面、图标按钮都能准确识别,效果惊艳
  • 快速搭建图片识别应用:阿里开源模型环境配置与推理脚本使用
  • 超影3d印刷:海报印刷/门票印刷/3d光栅立体画/3d印刷/光栅卡/光栅印刷/周边印刷/文件印刷/明信片印刷/选择指南 - 优质品牌商家
  • Qwen3.5-35B-A3B-AWQ-4bit镜像部署一文详解:内置模型目录+压缩张量+双卡验证
  • Pixel Dimension Fissioner多场景:游戏本地化文案、社区运营帖、PR稿裂变实践
  • Qwen-Image-2512-SDNQ Web服务效果展示:低光照/夜景/逆光等复杂光影Prompt生成效果