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

【华为OD机考真题】流水线调度 · 最短完工时间 (Java/Go)

一、题目题目描述一个工厂有 m 条流水线来并行完成 n 个独立的作业该工厂设置了一个调度系统在安排作业时总是优先执行处理时间最短的作业。现给定流水线个数 m需要完成的作业数 n每个作业的处理时间分别为 t1, t2 ... tn。请你编程计算处理完所有作业的耗时为多少当 n m 时首先处理时间短的 m 个作业进入流水线其他的等待当某个作业完成时依次从剩余作业中取处理时间最短的进入处理。输入描述第一行为 2 个整数采用空格分隔分别表示流水线个数 m 和作业数 n第二行输入 n 个整数采用空格分隔表示每个作业的处理时长 t1, t2 ... tn。0 m, n 1000 t1, t2 ... tn 100注保证输入都是合法的。输出描述输出处理完所有作业的总时长示例输入3 58 4 3 2 10输出13说明先安排时间为 2、3、4 的 3 个作业。第一条流水线先完成作业时间 2然后调度剩余时间最短的作业 8。第二条流水线完成作业时间 3然后调度剩余时间最短的作业 10。总工时就是第二条流水线完成作业的时间 133 10。二、解题思路贪心 最小堆模拟1. 核心逻辑这道题是一个典型的贪心算法结合优先队列的问题。贪心策略为了让总时间最短必须让忙碌的流水线尽早空闲下来去接新的活。因此总是把新任务交给当前预计完成时间最早的那条流水线。同时任务本身也要按从小到大的顺序处理确保短任务优先被消化。数据结构我们需要一个数据结构来维护 mm 条流水线的当前完成时间并能快速取出最小值。这正是最小堆Min-Heap的用武之地。2. 算法步骤排序将 n 个作业时长数组tasks从小到大排序。初始化堆如果 n≤m 直接返回最大的那个作业时长因为可以并行同时做。如果 nm 将前 m 个作业的时长放入最小堆中代表 m 条流水线目前的完工时间。模拟调度遍历剩余的 n−m 个作业。每次从堆顶弹出最小值min_time代表最早空闲的流水线时刻。将该时刻加上当前作业时长task得到新的完工时间new_time min_time task。将new_time重新推入堆中。获取结果当所有作业都分配完毕后堆中存储的是每条流水线的最终完工时间。答案即为堆中的最大值。技巧在 Go/Java 中堆弹空后的最后一个元素或者遍历堆数组找最大值即可。其实更简单的逻辑是最后一次弹出的min_time加上对应的task并不一定是最大值必须遍历堆中所有元素取最大值或者在循环结束后不断弹出堆直到只剩一个最大值不推荐破坏结构最直接的方法是遍历堆底层数组找最大。3. 复杂度分析时间复杂度排序 O(Nlog⁡N) 。堆操作共进行 N−m 次入堆和出堆每次 O(log⁡M) 。总复杂度 O(Nlog⁡NNlog⁡M) 。鉴于 N,M100 效率极高。空间复杂度 O(M) 用于存储堆。三、代码实现1. Java 实现Java 拥有强大的标准库java.util.PriorityQueue默认就是最小堆实现非常简洁。import java.util.Arrays; import java.util.PriorityQueue; import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner scanner new Scanner(System.in); // 读取 m 和 n if (!scanner.hasNextInt()) return; int m scanner.nextInt(); int n scanner.nextInt(); int[] tasks new int[n]; for (int i 0; i n; i) { tasks[i] scanner.nextInt(); } // 1. 贪心先对作业时长排序 Arrays.sort(tasks); // 特殊情况如果作业数少于等于流水线数耗时就是最长的那个作业 if (n m) { System.out.println(tasks[n - 1]); return; } // 2. 初始化最小堆存储每条流水线的“当前完成时间” // Java PriorityQueue 默认是最小堆 PriorityQueueInteger pq new PriorityQueue(); // 先将前 m 个作业分配给 m 条流水线 for (int i 0; i m; i) { pq.offer(tasks[i]); } // 3. 模拟调度过程 for (int i m; i n; i) { // 取出最早完成的流水线时间 int earliestFinishTime pq.poll(); // 将当前最短作业分配给它计算新的完成时间 int newFinishTime earliestFinishTime tasks[i]; // 放回堆中 pq.offer(newFinishTime); } // 4. 结果是所有流水线完成时间的最大值 // 此时堆中可能有多个元素需要遍历找最大值 int maxTime 0; for (int time : pq) { if (time maxTime) { maxTime time; } } System.out.println(maxTime); scanner.close(); } }2. Go 实现Go 的标准库container/heap需要用户实现heap.Interface接口。虽然稍微繁琐一点但能让我们更深入理解堆的底层运作且性能极佳。package main import ( container/heap fmt sort ) // IntHeap 定义一个最小堆类型 type IntHeap []int // 实现 heap.Interface 接口的五个方法 func (h IntHeap) Len() int { return len(h) } func (h IntHeap) Less(i, j int) bool { return h[i] h[j] } // 最小堆小的在上面 func (h IntHeap) Swap(i, j int) { h[i], h[j] h[j], h[i] } func (h *IntHeap) Push(x interface{}) { *h append(*h, x.(int)) } func (h *IntHeap) Pop() interface{} { old : *h n : len(old) x : old[n-1] *h old[0 : n-1] return x } func solve() { var m, n int if _, err : fmt.Scan(m, n); err ! nil { return } tasks : make([]int, n) for i : 0; i n; i { fmt.Scan(tasks[i]) } // 1. 贪心排序 sort.Ints(tasks) // 特殊情况 if n m { fmt.Println(tasks[n-1]) return } // 2. 初始化堆 h : IntHeap{} heap.Init(h) // 放入前 m 个作业 for i : 0; i m; i { heap.Push(h, tasks[i]) } // 3. 模拟调度 for i : m; i n; i { // 弹出最小值最早完成的流水线时间 earliest : heap.Pop(h).(int) // 加上新作业时间 newTime : earliest tasks[i] // 推回堆 heap.Push(h, newTime) } // 4. 找最大值 maxTime : 0 for _, t : range *h { if t maxTime { maxTime t } } fmt.Println(maxTime) } func main() { solve() }四、关键点深度解析1. 为什么必须先排序作业题目明确要求“总是优先执行处理时间最短的作业”。如果不排序直接按输入顺序分配可能会导致长作业阻塞了流水线而短作业在后面等待违背了题目的调度规则。排序保证了我们每次取出的tasks[i]都是当前剩余任务中最小的符合贪心策略。2. 为什么用最小堆维护流水线时间我们的目标是找到“谁最先闲着”。数组遍历找最小值是 O(M) 而堆顶取值是 O(1) 调整堆是 O(log⁡M) 。在 N 较大时堆的优势非常明显。本题虽然 N,M100 数据量小但在机考中养成使用合适数据结构的习惯至关重要。3. 结果为何是堆中的最大值堆中存储的是每条流水线最终的任务完成时刻。整个工厂完工取决于最慢的那条流水线。注意堆顶是最小值最早完成的所以不能直接Pop出来当结果必须遍历堆内所有元素取Max。4. 边界情况处理n≤m作业比流水线少或刚好够分。此时所有作业同时开始总耗时就是单个作业中最长的那个排序后的最后一个。代码中做了特判避免逻辑复杂化。输入合法性题目保证合法实际工程中可增加对 m0 等的防御性编程。五、总结与建议这道题是“多机调度问题”的一个简化变种带有特定贪心规则。思维转换将物理世界的“流水线空闲”抽象为数字世界中的“最小值弹出”。语言特性Java利用PriorityQueue可以快速写出生产级代码适合追求开发效率的场景。Go通过实现heap.Interface展示了 Go 接口组合的灵活性适合对性能和底层控制有要求的场景。给考生的建议熟记模板Java 的PriorityQueue用法和 Go 的heap接口实现模板要烂熟于心。审题细节注意题目中的“优先执行短作业”是指任务队列的排序而“空闲即插”是指资源的分配策略两者结合才是正解。结果提取千万不要以为堆顶就是答案对于“完工时间”类问题答案往往是集合中的最大值。掌握这种“排序 优先队列模拟”的模式你可以轻松解决类似的资源分配、任务调度、甚至哈夫曼编码构造等问题

相关文章:

【华为OD机考真题】流水线调度 · 最短完工时间 (Java/Go)

一、题目题目描述: 一个工厂有 m 条流水线,来并行完成 n 个独立的作业,该工厂设置了一个调度系统,在安排作业时,总是优先执行处理时间最短的作业。 现给定流水线个数 m,需要完成的作业数 n,每个…...

OpenClaw技能组合:百川2-13B量化模型处理复杂工作流的秘诀

OpenClaw技能组合:百川2-13B量化模型处理复杂工作流的秘诀 1. 从零搭建电商价格监控系统的动机 去年双十一期间,我负责跟踪30多个竞品的价格波动。手动刷新网页、记录Excel、计算差价的过程让我每天工作到凌晨两点。这种重复劳动让我开始思考&#xff…...

驱动管理与系统优化:Driver Store Explorer全方位空间清理指南

驱动管理与系统优化:Driver Store Explorer全方位空间清理指南 【免费下载链接】DriverStoreExplorer Driver Store Explorer [RAPR] 项目地址: https://gitcode.com/gh_mirrors/dr/DriverStoreExplorer 你是否遇到过系统C盘空间莫名减少的情况?即…...

英语课件PPT免费模板2026实测优选清单

英语教师备课常陷入两难:想做精美课件吸引学生注意力,却没时间设计PPT;网上搜索英语课件PPT免费模板,要么质量粗糙、排版混乱,要么暗藏水印、无法编辑,浪费大量备课时间。本文实测5款主流工具,筛…...

中文文献怎么检索更全?新手常见坑与修复方法

很多人第一次写毕业论文、做文献综述或准备开题报告时,都会遇到一个非常具体、也非常折磨人的问题:明明已经查了很多中文文献,结果还是总觉得“不够全”。这种感觉你大概率不陌生。输入一个关键词,数据库一下子出来几百篇&#xf…...

OpenClaw故障排查手册:Qwen3-32B镜像连接失败7种解决方案

OpenClaw故障排查手册:Qwen3-32B镜像连接失败7种解决方案 1. 问题背景与典型症状 上周在本地部署Qwen3-32B镜像时,我的OpenClaw突然报出ModelProviderConnectionError错误。这个RTX4090D优化版镜像本应是开箱即用的,但实际对接过程中遇到了…...

从价格战到价值战:蚂蚁保定期寿险调价背后的市场新周期

且买且珍惜,就在2026年3月,蚂蚁保等主流平台将多款热销的定期寿险产品给悄悄换上了新“价签”,对于许多关注互联网保险的用户而言,一场酝酿已久的行业性调价正式拉开了序幕。这并非一次简单的产品迭代,而是标志着互联网…...

《深度研究:提示工程架构师在Agentic AI上下文工程用户体验设计的创新实践》

深度研究:提示工程架构师在Agentic AI上下文工程用户体验设计的创新实践 一、引言:为什么你用AI总觉得“它不懂我”? 钩子:你经历过这些AI“尬聊”时刻吗? 早上你跟AI助手说:“帮我订明天去上海的高铁票,要靠窗的。”它秒回:“已为你预订G123次列车08:00出发的靠窗座…...

DeOldify移动端适配初探:在Android设备上实现本地图片上色功能

DeOldify移动端适配初探:在Android设备上实现本地图片上色功能 你有没有翻看家里老相册的经历?那些泛黄的黑白照片,承载着珍贵的记忆,却总让人觉得少了点色彩的温度。过去,给老照片上色是件专业且耗时的事&#xff0c…...

ChatGPTuino:ESP32/Arduino轻量级LLM嵌入式客户端

1. ChatGPTuino 库概述:面向嵌入式设备的轻量级 OpenAI API 客户端ChatGPTuino 是一个专为资源受限嵌入式平台设计的 Arduino 兼容库,其核心目标是将 OpenAI 的 ChatGPT 文本生成能力无缝集成到 WiFi 连接的微控制器系统中。该库并非简单封装 HTTP 请求&…...

RK3588上跑iperf3测速前,你的RTL8188eus USB WiFi驱动真的装对了吗?避坑指南

RK3588上RTL8188eus USB WiFi驱动深度调优指南:从编译到iperf3测速全流程解析 在RK3588平台上部署RTL8188eus USB WiFi驱动看似简单,实则暗藏玄机。许多开发者往往在驱动"看似"安装成功后,却面临连接不稳定、速度不达标等棘手问题。…...

广州口碑第一,数谷AI定制优化究竟为企业解决了哪些痛点?

广州口碑第一,数谷AI定制优化究竟为企业解决了哪些痛点?在2026年这个节点,大湾区的商业竞争早已从“流量争夺”全面转向了“模型权重博弈”。如果你走进深圳龙岗华通大厦的会议室,或是漫步在东莞松山湖的科技园区,会发…...

3分钟掌握ncmdump:网易云音乐NCM文件解密与转换的完整指南

3分钟掌握ncmdump:网易云音乐NCM文件解密与转换的完整指南 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 你是否遇到过从网易云音乐下载的歌曲只能在特定客户端播放,无法在其他设备或播放器使用的困扰&#…...

windows安装docker desktop wsl too old,wsl --update速度为0解决方法

WSL needs updating Your version of Windows Subsystem for Linux (WSL) is too old. Run the command below to update or for more information, visit .the Microsoft WSL documentation wsl --update 如果你遇到 C:\Users\a1>wsl --update 正在安装: 适用于 Linux …...

TensorFlow-v2.15效果实测:量化后模型体积缩小75%,推理速度提升3倍

TensorFlow-v2.15效果实测:量化后模型体积缩小75%,推理速度提升3倍 1. 测试背景与目标 TensorFlow 2.15作为Google推出的长期支持版本(LTS),在模型优化和部署效率方面带来了显著改进。本次测试将聚焦一个核心问题:量化技术在实际…...

花 9 万刀雇应届生不如用 AI?大厂校招腰斩,2026 年应届生入行指南

一、大厂校招腰斩的核心真相:不是应届生不行,是AI重构了人才需求 2023-2025年,国内头部互联网、科技大厂校招HC(Head Count,招聘名额)平均缩水40%以上,部分企业甚至直接暂停非核心岗位校招。外界…...

Flux Sea Studio 海景摄影生成工具一键部署教程:Python环境快速配置指南

Flux Sea Studio 海景摄影生成工具一键部署教程:Python环境快速配置指南 你是不是也对那些波澜壮阔、光影绝美的AI生成海景大片心动不已?想自己动手试试,却被复杂的模型部署和环境配置劝退?别担心,今天咱们就来聊聊如…...

如何快速制作精准LRC歌词:LRC Maker完整使用指南

如何快速制作精准LRC歌词:LRC Maker完整使用指南 【免费下载链接】lrc-maker 歌词滚动姬|可能是你所能见到的最好用的歌词制作工具 项目地址: https://gitcode.com/gh_mirrors/lr/lrc-maker 告别手动逐句对齐的繁琐,迎接智能高效的歌词…...

QuickRedis终极指南:永久免费的Redis可视化管理工具快速上手

QuickRedis终极指南:永久免费的Redis可视化管理工具快速上手 【免费下载链接】quick_redis_blog QuickRedis is a free forever Redis Desktop manager. It supports direct connection, sentinel, and cluster mode, supports multiple languages, supports hundre…...

环保与技术的双重革命:Legacy-iOS-Kit让旧iOS设备焕发新生

环保与技术的双重革命:Legacy-iOS-Kit让旧iOS设备焕发新生 【免费下载链接】Legacy-iOS-Kit An all-in-one tool to downgrade/restore, save SHSH blobs, and jailbreak legacy iOS devices 项目地址: https://gitcode.com/gh_mirrors/le/Legacy-iOS-Kit 你…...

GD32利用Systick实现高精度μs与ms延时函数的设计与优化

1. Systick定时器基础原理 在嵌入式开发中,精准延时是每个工程师都会遇到的基础需求。GD32作为国产ARM Cortex-M内核单片机,其内置的Systick定时器就是我们实现微秒(μs)和毫秒(ms)级延时的利器。不同于通用定时器,Systick是Cortex-M内核自带…...

VMware ESXi上玩转Proxmox VE:家庭实验室搭建全记录(附OpenWrt配置)

VMware ESXi与Proxmox VE混合虚拟化实战:打造高性能家庭实验室 在家庭环境中搭建多功能虚拟化平台,已经成为越来越多技术爱好者的新选择。将成熟的商业虚拟化方案VMware ESXi与开源的Proxmox VE结合使用,既能发挥各自优势,又能在…...

菊厂员工家属吐槽:42 岁老公越干越起劲,牛马当久了形成意识了,周末不加班他也是五六点早起,晚上一两点睡,让他休息都不干!

前段时间刷到一个菊厂员工家属的讨论集合帖。有位 42 岁员工喊着要离职,却卡在进退两难的关口:提前走,保留股票要打折,多年奋斗的财富会缩水。继续熬吧,身体和精力早已被工作透支。一边是提前退休要打折股票的现实压力…...

N76E003开发环境搭建避坑指南:从Keil C-51安装到Nu-Link驱动配置

N76E003开发环境搭建避坑指南:从Keil C-51安装到Nu-Link驱动配置 对于初次接触N76E003开发的工程师来说,搭建一个稳定可靠的开发环境是项目成功的第一步。本文将深入解析从Keil C-51安装到Nu-Link驱动配置的全流程,特别针对那些容易让人"…...

小白程序员必备:收藏这份AI Agent设计模式指南,轻松入门大模型开发

AI Agent的设计模式正在经历从学术概念到工业标准的关键转折。 ReAct、Planning、单智能体和多智能体四种核心模式构成了当前Agent系统的技术基座,而Anthropic在其"Building Effective Agents"指南中反复强调的核心原则——“从最简单的方案开始&#xff…...

科研小白必看:如何用学校邮箱快速注册Reaxys数据库(附常见问题解答)

科研新手高效注册Reaxys数据库的完整指南与实战技巧 刚踏入科研领域时,获取权威数据库的使用权限往往是第一个需要跨越的门槛。作为Elsevier旗下的核心化学数据库,Reaxys以其海量的化合物信息和反应数据成为众多研究者的首选工具。但对于初次接触的同学来…...

【2024唯一权威实测报告】:Python 3.15异步HTTP客户端QPS突破142,000,但93%开发者尚未启用这3个关键配置!

第一章:Python 3.15异步HTTP客户端性能跃迁全景图Python 3.15正式将httpx.AsyncClient深度集成至标准库asyncio.http模块,并引入零拷贝响应流、协程级连接复用池与自适应超时调度器三大底层优化机制。基准测试显示,在万级并发GET请求场景下&a…...

别再只会用FFT了!用MATLAB玩转信号功率谱分析:从周期图到Welch法的保姆级实战

别再只会用FFT了!用MATLAB玩转信号功率谱分析:从周期图到Welch法的保姆级实战 当你面对一段嘈杂的工业振动信号,或是夹杂着环境噪声的脑电数据时,快速准确地识别其中的频率成分往往成为解决问题的关键。传统教学中强调的FFT变换虽…...

E2E自驾规控30讲:导论

欢迎来到端到端(End-to-End)自动驾驶与机器人控制的世界!这也是目前工业界和学术界最具挑战、也最激动人心的技术前沿。一、 端到端规划控制概述:打破“接力赛”在传统的自动驾驶或机器人系统中,架构通常是高度模块化的…...

如何安全解锁华为设备Bootloader:面向普通用户的完整指南

如何安全解锁华为设备Bootloader:面向普通用户的完整指南 【免费下载链接】PotatoNV Unlock bootloader of Huawei devices on Kirin 960/95х/65x/620 项目地址: https://gitcode.com/gh_mirrors/po/PotatoNV 对于许多华为设备用户来说,Bootload…...