华为OD机试真题——模拟工作队列(2025B卷:200分)Java/python/JavaScript/C/C++/GO最佳实现

article/2025/6/17 11:23:07

在这里插入图片描述

2025 B卷 200分 题型

本专栏内全部题目均提供Java、python、JavaScript、C、C++、GO六种语言的最佳实现方式;
并且每种语言均涵盖详细的问题分析、解题思路、代码实现、代码详解、3个测试用例以及综合分析;
本文收录于专栏:《2025华为OD真题目录+全流程解析+备考攻略+经验分享》

华为OD机试真题《模拟工作队列》:


文章快捷目录

题目描述及说明

Java

python

JavaScript

C

GO


题目名称:模拟工作队列


  • 知识点:优先队列(堆)、事件模拟、逻辑处理
  • 时间限制:1秒
  • 空间限制:256MB
  • 限定语言:不限

题目描述

模拟一个工作队列的运作,包含一个任务提交者和若干任务执行者(编号从1开始)。提交者在给定时刻向队列提交任务(含执行时间),执行者取出任务的时刻加上执行时间即为完成时刻。任务完成后,执行者从队列中取最老的任务执行;若多个执行者空闲,编号小的优先。

队列规则

  1. 队列有最大长度限制,满时新任务加入会丢弃最老任务。
  2. 若队列满且新任务提交时刻与执行者空闲时刻相同,则先取出最老任务执行,再加入新任务。

输入

  • 第一行:2N个正整数,表示N个任务的提交时刻和执行时间(按提交时刻升序排列)。
  • 第二行:两个整数,分别为队列最大长度和执行者数量。

输出

  • 最后一个任务完成时刻和被丢弃的任务数量,用空格分隔。

示例1
输入:

1 3 2 2 3 3  
3 2  

输出:

7 0  

说明:队列未满,无任务丢弃。

示例2
输入:

1 6 2 4 4 3 6 3  
1 2  

输出:

10 0  

说明:队列满但执行顺序避免丢弃。


Java

问题分析

我们需要模拟一个工作队列,处理任务的提交和执行者的调度。队列有最大长度限制,当队列满时新任务会丢弃最老的任务。执行者在空闲时会立即从队列中取出任务执行。输出最后完成时间和被丢弃的任务数。

解题思路

  1. 优先队列管理执行者:使用优先队列(最小堆)按执行者的完成时间和编号排序,以快速获取空闲的执行者。
  2. 任务队列管理:使用FIFO队列保存待处理的任务。
  3. 事件处理顺序
    • 处理每个任务提交时,先处理所有执行者的完成时间小于等于当前时间的事件。
    • 提交任务,处理队列满时的丢弃逻辑。
    • 再次处理执行者的完成时间小于等于当前时间的事件。
  4. 处理剩余任务:在所有任务提交后,处理队列中剩余的任务。

代码实现

import java.util.*;public class Main {static class Worker implements Comparable<Worker> {int time; // 执行者的空闲时间int id;public Worker(int time, int id) {this.time = time;this.id = id;}@Overridepublic int compareTo(Worker other) {if (this.time != other.time) {return Integer.compare(this.time, other.time);} else {return Integer.compare(this.id, other.id);}}}public static void main(String[] args) {Scanner scanner = new Scanner(System.in);String[] taskInput = scanner.nextLine().split(" ");int n = taskInput.length / 2;int[] submitTimes = new int[n];int[] durations = new int[n];for (int i = 0; i < n; i++) {submitTimes[i] = Integer.parseInt(taskInput[2 * i]);durations[i] = Integer.parseInt(taskInput[2 * i + 1]);}int maxQueueSize = scanner.nextInt();int workerCount = scanner.nextInt();PriorityQueue<Worker> workerQueue = new PriorityQueue<>();for (int i = 1; i <= workerCount; i++) {workerQueue.add(new Worker(0, i));}Queue<Integer> taskQueue = new LinkedList<>();int discardCount = 0;int[] lastFinishTime = {0};for (int i = 0; i < n; i++) {int t = submitTimes[i];int d = durations[i];processWorkers(workerQueue, taskQueue, t, lastFinishTime);if (taskQueue.size() >= maxQueueSize) {taskQueue.poll();discardCount++;}taskQueue.add(d);processWorkers(workerQueue, taskQueue, t, lastFinishTime);}processRemainingTasks(workerQueue, taskQueue, lastFinishTime);System.out.println(lastFinishTime[0] + " " + discardCount);}private static void processWorkers(PriorityQueue<Worker> workerQueue, Queue<Integer> taskQueue, int currentTime, int[] lastFinishTime) {while (!workerQueue.isEmpty()) {Worker worker = workerQueue.peek();if (worker.time > currentTime) {break;}worker = workerQueue.poll();if (taskQueue.isEmpty()) {workerQueue.add(worker);break;}int duration = taskQueue.poll();worker.time += duration;if (worker.time > lastFinishTime[0]) {lastFinishTime[0] = worker.time;}workerQueue.add(worker);}}private static void processRemainingTasks(PriorityQueue<Worker> workerQueue, Queue<Integer> taskQueue, int[] lastFinishTime) {while (!taskQueue.isEmpty()) {Worker worker = workerQueue.poll();if (worker == null) break;int duration = taskQueue.poll();worker.time += duration;if (worker.time > lastFinishTime[0]) {lastFinishTime[0] = worker.time;}workerQueue.add(worker);}}
}

代码详解

  1. Worker类:表示执行者,包含空闲时间和编号,按完成时间和编号排序。
  2. 输入处理:读取任务列表、队列长度和执行者数量。
  3. 初始化执行者队列:所有执行者初始空闲时间为0。
  4. 处理每个任务提交
    • processWorkers处理所有执行者完成时间小于等于当前时间的事件,取出任务执行。
    • 检查队列是否满,丢弃旧任务并计数。
    • 将新任务加入队列,再次处理执行者事件。
  5. 处理剩余任务:在所有任务提交后,确保队列中的任务被处理完。
  6. 输出结果:最后完成时间和丢弃任务数。

示例测试

示例1
输入:

1 3 2 2 3 3  
3 2  

输出:

7 0  

解析:所有任务被及时处理,无丢弃,最后完成时间为7。

示例2
输入:

1 6 2 4 4 3 6 3  
1 2  

输出:

10 0  

解析:队列满时丢弃被避免,最后完成时间为10,无丢弃。

示例3
输入:

2,2  
1 1  

输出:

4 0  

解析:任务在队列中等待,执行者处理完所有任务,最后完成时间4。

综合分析

  1. 时间复杂度:每个任务处理两次优先队列操作,O(N log K),其中K为执行者数量。
  2. 空间复杂度:O(K + M),K为执行者数量,M为队列最大长度。
  3. 最优性:优先队列确保每次选择最早空闲的执行者,FIFO队列保证任务顺序,处理逻辑高效。
  4. 适用性:适用于任务按时间顺序提交的场景,正确处理队列满和任务丢弃逻辑。

python

问题分析

我们需要模拟一个工作队列,处理任务的提交和执行者的调度。队列有最大长度限制,当队列满时新任务会丢弃最老的任务。执行者在空闲时会立即从队列中取出任务执行。输出最后完成时间和被丢弃的任务数。

解题思路

  1. 事件驱动模拟:按时间顺序处理任务提交和执行者空闲事件。
  2. 优先队列:管理执行者的空闲事件,确保空闲时间早的执行者优先处理任务。
  3. 队列管理:使用FIFO队列保存任务,处理队列满时的丢弃逻辑。
  4. 完成时间计算:跟踪每个任务的完成时间,更新最大完成时间。

代码实现

import heapq
from collections import dequedef main():# 读取输入task_input = list(map(int, input().split()))queue_size, worker_count = map(int, input().split())# 解析任务列表,按提交时间排序tasks = []for i in range(0, len(task_input), 2):submit_time = task_input[i]duration = task_input[i+1]tasks.append((submit_time, duration))tasks<

http://www.hkcw.cn/article/TBkTQIMKva.shtml

相关文章

白俄罗斯总统抵达北京释放何信号 特朗普急了

白俄罗斯总统卢卡申科宣布访华三天,这一消息引发了国际关注。与此同时,白宫主动放出风声,称中美会谈即将举行,这释放了何种信号?白俄罗斯总统专机抵达北京之际,美国似乎被冷落。自五月底以来,关于特朗普希望与中方会面的消息不断传出。特朗普曾表示确信会与中方通话,但…

山西一小区地下水“高烧”到72摄氏度 地热原因成谜

近日,山西长治锦绣司马小区的居民反映,小区内一些业主地下室温度高达40摄氏度,附近抽出来的地下水温度更是达到72摄氏度。多个部门前来调查,但未能找到地热原因。视频显示,小区外面绿化带已被挖开,几根黑色粗管堆放在一起,一根细管从绿化带位置延伸到下水井,管中不断有…

83岁李明博高调亮相为金文洙打气 前总统力挺候选人

在韩国国内提前投票的第一天,73岁的前总统朴槿惠和74岁的文在寅分别前往居住地的投票站,投下了他们的一票。朴槿惠支持的是金文洙,而文在寅则选择了李在明。前总理韩德洙也提前为金文洙投票。朴槿惠曾被大法院终审判处22年有期徒刑,公民政治权利自动被剥夺。但在2021年底,…

华为OD机试真题——最小的调整次数/特异性双端队列(2025B卷:100分)Java/python/JavaScript/C++/C语言/GO六种最佳实现

2025 B卷 100分 题型 本文涵盖详细的问题分析、解题思路、代码实现、代码详解、测试用例以及综合分析; 并提供Java、python、JavaScript、C++、C语言、GO六种语言的最佳实现方式! 2025华为OD真题目录+全流程解析/备考攻略/经验分享 华为OD机试真题《最小的调整次数/特异性双端…

华为OD机试真题——模拟消息队列(2025B卷:100分)Java/python/JavaScript/C++/C语言/GO六种最佳实现

2025 B卷 100分 题型 本文涵盖详细的问题分析、解题思路、代码实现、代码详解、测试用例以及综合分析; 并提供Java、python、JavaScript、C++、C语言、GO六种语言的最佳实现方式! 2025华为OD真题目录+全流程解析/备考攻略/经验分享 华为OD机试真题《模拟消息队列》: 目录 题…

自称有两栋楼征婚者回应质疑 非炒作求偶遇

在广州天河猎德村举行的龙舟招景盛会上,一名脖子上挂着“两栋楼,海珠,未婚”牌子的男子引起了网络关注。这名林姓男子是广州海珠区仑头人,1990年出生,身高超过1米7,已经单身三年。林先生表示,他并非想炒作当网红,而是希望通过网络征婚找到合适的另一半。他解释说,在盛…

郑钦文:输球更多是自己原因 心态需更稳

北京时间6月3日,2025年法网女单1/4决赛中,郑钦文以0-2的比分不敌萨巴伦卡,未能晋级四强。赛后,她接受了采访。郑钦文表示,一开始上场时状态不错,但主要是自己的原因导致失利。在领先时给了对手太多非受迫性失误,包括发球和关键时刻的双误。面对压力时处理得不够好,这是…

没想到在杨子身上看到了演技 影帝潜力初现

大家印象里的杨子是一个什么样的人?我谈谈我对杨子的认知。之前杨子在我心中是一个霸总,是带资进组的董永。但看完他在《再见爱人4》中的表现后,他变成了一个特别让人费解的人。尤其是录完节目后,他在直播间向黄圣依求婚,这种抽象的行为让我感到震惊。因此,我对杨子的印象…

郑钦文连续3年大满贯被萨巴横扫 关键球处理成胜负手

在法网女单1/4决赛中,郑钦文以0-2的比分不敌萨巴伦卡,未能晋级四强。近三年来,郑钦文在大满贯赛事中三次遭遇萨巴伦卡,均被横扫出局。2023年美网八强赛、2024年美网以及今年的法网,郑钦文在这三场比赛中都未能战胜对手。双方实力差距明显,特别是在关键球处理上,这是郑钦…

15岁少年因发出笑声遭路人围殴 误会引发暴力事件

昨晚,四川古蔺县公安局发布警情通报。5月26日,古蔺县公安局东城派出所接到群众报警,称熊某于24日被他人殴打,警方随即展开调查。经调查发现,2025年5月24日凌晨4时许,黄某某(15岁)和熊某(15岁)骑车经过金兰大道税务局路段时发出笑声,路边的陈某甲(15岁)误以为他们在…

【 SpringCloud | 微服务 网关技术 】

单体架构时我们只需要完成一次用户登录、身份校验&#xff0c;就可以在所有业务中获取到用户信息。而微服务拆分后&#xff0c;每个微服务都独立部署&#xff0c;这就存在一些问题&#xff1a; 每个微服务都需要编写登录校验、用户信息获取的功能吗&#xff1f; 当微服务之间调…

深圳警方通报一女子大厦高坠死亡 排除刑事案件

6月3日,深圳市公安局龙华分局发布警情通报。6月2日上午9时左右,一名21岁的女子陈某某在龙华区宁远路附近某大厦高坠身亡。经现场勘查、走访调查及视频排查证实,陈某某于6月1日从外省来到深圳,次日早上7时30分许步行至该大厦,并独自乘电梯到30楼徘徊停留。8时51分,她自行翻…

乌军蛛网行动战果到底如何 俄方称其为“谎言蛛网”

俄罗斯“与假新闻作战”网站发布文章指出,通过分析乌克兰方面发布的视频可以确认,乌总统泽连斯基声称“已摧毁34%俄罗斯远程机队”的说法并不属实。俄方认为,乌方的行动更像是编织了一个“谎言蛛网”。俄方分析显示,乌克兰实际上可能只摧毁了两架图-95战略轰炸机和一架安-1…

Ubuntu 安装 Cursor

Cursor 目前只有 Windows 和 Mac 版本&#xff0c;那么如何在 Ubuntu 上运行呢&#xff1f; 本质上是一个如何在 Ubuntu 运行 .appimage 的问题。 1. 下载 Cursor Linux 首先找到 Cursor 官网&#xff0c;下载 x64 安装包&#xff0c;如果你是 arm 架构&#xff0c;就下载 ar…

在Ubuntu22.04 配置安装Dify Ollma 以及Deepseek配置

在Ubuntu22.04 配置安装Dify Ollma 以及Deepseek配置 文章目录 在Ubuntu22.04 配置安装Dify Ollma 以及Deepseek配置前言一、安装docker以及docker compose1. 更新软件包2. 安装docker依赖3. 添加docker密钥4.添加阿里云docker软件源5.安装docker和docker compose6.配置用户组(…

Ubuntu+Docker实战:手把手教你整合MyIP与cpolar实现内网穿透

文章目录 前言1.关于 MyIP2.Docker 部署3.MyIP 简单使用4.安装 cpolar 内网穿透5. 配置公网地址6. 配置固定公网地址总结 前言 技术探索者们请注意&#xff01;我们即将揭晓一项突破性网络技术方案——MyIP 系统&#xff01;这项创新技术颠覆了传统网络部署模式&#xff0c;即…

Ubuntu 22的安装,换源和配置(详细)

目录 1.安装 1.1.打开虚拟机 1.2.选择语言 1.3.版本更新 &#xff08;跳过即可&#xff09; 1.4. 键盘配置 1.5.选择安装类型 1.6.网络配置 1.7.配置代理 1.8.引导式存储布局配置 1.9.配置用户信息 1.10.安装OpenSSH服务包 1.11.选择安装服务软件包 2.换源和配…

使用Ubuntu快速部署MinIO对象存储

想拥有自己的私有云存储&#xff0c;安全可靠又高效&#xff1f;MinIO是你的理想选择&#xff01;这篇文章将手把手教你如何在Ubuntu 22.04服务器上部署MinIO&#xff0c;并使用Nginx反向代理和Let’s Encrypt证书进行安全加固。 即使你是新手&#xff0c;也能轻松完成&#xf…

ubuntu中使用ollama部署本地deepseek

ubuntu中使用ollama部署本地deepseek 一、安装Docker 1、先卸载旧版&#xff0c;如果没有的话&#xff0c;就不用执行了&#xff0c;直接第二步。 apt-get remove docker docker-engine docker.io containerd runc 2、在终端输入 apt update apt-get install ca-certifica…

Ubuntu 24.04.2 LTS 桌面版系统安装、分区、配置全记录

引言 记录了一次完整的系统安装与环境配置过程&#xff0c;包括启动盘制作、安装引导、镜像源替换、中文输入法配置、驱动和CUDA安装、docker安装和完整配置过程、SSH配置、软件安装&#xff08;App Store软件安装与其他软件安装&#xff0c;以VScode和Mathlab为例&#xff09…