用优先队列 + 懒删除模拟打印调度:
(-priority, jobId):优先级大者先出;同优先级编号小者先出。active 记录当前仍在队列中的任务编号。submit:若编号已在 active 返回 false,否则入堆并登记。cancel:仅从 active 删除(堆中残留条目在 peek/pop 时惰性清掉)。peekJob / popJob:先弹出堆顶中已取消的脏数据,再读/取真正的下一任务。打印中心用优先级队列安排任务:优先级高的先打;优先级相同则任务编号小的先打。已入队任务可取消。请实现调度器。
实现类 JobQueueSys:
JobQueueSys():初始化空队列。submit(int jobId, int priority):提交任务。若该编号已在队列中返回 false,否则入队并返回 true。cancel(int jobId):取消仍在队列中的任务。成功返回 true;不在队列中返回 false。popJob():取出并返回下一个应打印的任务编号;队列为空返回 -1。peekJob():返回下一个应打印的任务编号但不取出;队列为空返回 -1。优先级越大越优先。已弹出的任务不再视为在队列中;被取消的任务也不能再被 popJob / peekJob 取到。取消后再用同一编号 submit 视为新任务。
请实现类 JobQueueSys。
每行一次函数调用;首行必为 JobQueueSys()。累计调用 ≤1000。
0≤jobId≤10000,0≤priority≤10000。
每次调用一行结果;无返回值输出 null;布尔输出小写 true / false;整型原样输出。
输入:
JobQueueSys()
submit(2, 5)
submit(1, 5)
submit(3, 8)
peekJob()
popJob()
peekJob()
cancel(1)
popJob()
popJob()
输出:
null
true
true
true
3
3
1
true
2
-1
说明:
优先级 8 的 3 先被看到并取出。剩下 1、2 优先级同为 5,编号小的 1 在前。取消 1 后弹出 2,队列空。
输入:
JobQueueSys()
submit(7, 1)
submit(7, 9)
cancel(8)
popJob()
cancel(7)
peekJob()
输出:
null
true
false
false
7
false
-1
说明:
重复提交 7 失败。取消不存在的 8 失败。弹出 7 后再取消 7 失败,队列已空。
By signing up a CodeFun2000 universal account, you can submit code and join discussions in all online judging services provided by us.