使用两个优先队列进行调度,一个是busy队列,维护任务结束的时间和服务器的id,一个空闲队列idle,维护服务器的权重和id,每次调度时,先释放busy队列,然后看看是否空闲,C++11经典写法:
mordern C++写法
class Solution {
private:
using PLI = pair<long long, int>;
using PII = pair<int, int>;
using LL = long long;
public:
vector<int> assignTasks(vector<int>& servers, vector<int>& tasks) {
// 工作中的服务器,存储二元组 (t, idx)
priority_queue<PLI, vector<PLI>, greater<PLI>> busy;
// 空闲的服务器,存储二元组 (w, idx)
priority_queue<PII, vector<PII>, greater<PII>> idle;
int n = servers.size(), m = tasks.size();
vector<int> res(m);
for(int i = 0; i < n; i++) {
idle.emplace(servers[i], i);
}
LL t = 0;
auto release = [&] () {
while (!busy.empty() && t >= busy.top().first) {
auto&& [_, idx] = busy.top();
idle.emplace(servers[idx], idx);
busy.pop();
}
};
for (int i = 0; i < m; i++) {
t = max(t, static_cast<LL>(i));
release();
if (idle.empty()) {
t = busy.top().first;
release();
}
auto&& [_, idx] = idle.top();
res[i] = idx;
busy.emplace(t + tasks[i], idx);
idle.pop();
}
return res;
}
};