思路:
- 模拟
- 列出空闲的服务器,和正在忙碌的服务器
- 请求服务进来后,先更新忙碌的服务器,如果
arrival[i - 1] + load[i] < arrival[i]
就把他丢给空闲的服务器里 - 如果当前没有空闲的服务器,则抛弃请求
- 进行查找空闲的服务器里的节点,考虑到如果
i % k
找不到。就把请求丢给空闲里的第一个,把找到的服务器从空闲服务器丢到忙碌服务器里,接着把这个服务器处理请求的次数加1就行 - 最后找请求次数里最多的数,并遍历最终的请求次数数组,把相同请求次数服务器的序号找出来,放进答案数组
代码:
class Solution {
public:
vector<int> busiestServers(int k, vector<int>& arrival, vector<int>& load) {
priority_queue<int, vector<int>, greater<int>> available;
for(int i = 0; i < k; i++){
available.push(i);
}
priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>> > busy;
vector<int> requests(k, 0);
for(int i = 0; i < arrival.size(); i++){
while(!busy.empty() && busy.top().first <= arrival[i]){
auto[_, id] = busy.top();
busy.pop();
available.push(i + ((id - i) % k + k) % k);
}
if(available.empty()){
continue;
}
int id = available.top() % k;
available.pop();
requests[id]++;
busy.push({arrival[i] + load[i], id});
}
int maxRequest = *max_element(requests.begin(), requests.end());
vector<int> ret;
for(int i = 0; i < k; i++){
if(requests[i] == maxRequest){
ret.push_back(i);
}
}
return ret;
}
};