本题是哈希表模拟题:维护集群节点与任务的状态,按 best-fit 规则调度。
用两张表即可:
cap[nodeId] / used[nodeId] / jobCnt[nodeId]:节点容量、已用额度、其上未结束任务数jobs[jobId] -> (nodeId, size):运行中任务的落点与占用容器平台要在一组计算节点上调度任务。每个节点有固定的 CPU 额度;任务占用整数额度,运行期间不可迁移(本题不提供迁移接口)。调度采用 best-fit:在所有「剩余额度足够」的节点中,选剩余额度最小的那个;若仍并列,选 nodeId 更小的节点。
请实现类 ClusterPool:
ClusterPool():初始化空集群(无节点、无任务)。addNode(int nodeId, int capacity):上线一个容量为 capacity 的节点。
nodeId 已存在,或 capacity <= 0,返回 false,不改动true(初始已用额度为 0)removeNode(int nodeId):下线节点。
falsefalsetruesubmit(int jobId, int size):提交任务。
jobId 已在运行,或 size <= 0,返回 -1-1nodeIdkill(int jobId):结束任务并释放其占用的额度。
falsetrueusedOf(int nodeId):查询节点当前已用额度;节点不存在返回 -1freeOf(int nodeId):查询节点当前剩余额度(capacity - used);节点不存在返回 -1jobNode(int jobId):查询任务所在节点;任务不在运行返回 -1说明:
jobId 互异才允许同时运行;结束后同一 jobId 可以再次 submitremoveNode 成功后,该 nodeId 可以重新 addNode(容量可以不同)约束:累计调用 ≤4000;1≤nodeId,jobId≤106;1≤capacity,size≤109(非法非正则由对应接口返回失败)。
每行一次函数调用,首行必为 ClusterPool()。
每次调用一行:
nulladdNode / removeNode / kill 输出 true / falsesubmit / usedOf / freeOf / jobNode 输出整数输入:
ClusterPool()
addNode(2, 10)
addNode(1, 10)
submit(100, 6)
submit(101, 6)
submit(102, 5)
usedOf(1)
usedOf(2)
freeOf(1)
kill(100)
submit(102, 5)
removeNode(2)
kill(101)
removeNode(2)
jobNode(102)
输出:
null
true
true
1
2
-1
6
6
4
true
1
false
true
true
1
说明:
nodeId=1-1kill(100) 后节点 1 剩余变 10;再 submit(102,5) 时:节点 1 剩余 10、节点 2 剩余 4,仅节点 1 能装下,返回 1removeNode(2) 失败;杀掉 101 后可以下线;此时 jobNode(102)=1输入:
ClusterPool()
addNode(5, 3)
addNode(5, 9)
submit(1, 0)
submit(1, 3)
submit(1, 1)
kill(2)
jobNode(1)
freeOf(5)
removeNode(5)
kill(1)
removeNode(5)
输出:
null
true
false
-1
5
-1
false
5
0
false
true
true
说明:重复 addNode(5) 失败;size=0 非法;同一 jobId 重复提交失败;节点仍有任务时不能删除。
By signing up a CodeFun2000 universal account, you can submit code and join discussions in all online judging services provided by us.