原题链接:1606. 找到处理最多请求的服务器
solution: 模拟 + 有序集合 + 优先队列
typedef pair<int,int> PII;
class Solution {
public:
vector<int> busiestServers(int k, vector<int>& arrival, vector<int>& load) {
int n = arrival.size(); //保存请求的数量
vector<int> cnt(k, 0); //cnt数组保存每个服务器处理请求的次数
set<int> avails; //保存空闲的服务器,升序排列
int Maxuse = 0; //保存处理的最多的请求次数
priority_queue<PII, vector<PII>, greater<PII>> q;//定义小根堆
//first保存处理请求的结束时间,second保存处理请求的服务器编号
for(int i = 0;i < k;i++) avails.insert(i); //初始化将所有服务器插入avails
for(int i = 0;i < n;i++){
int t = arrival[i]; //保存当前请求到来的时间
while(!q.empty() && q.top().first <= t){ //小根堆不为空,已经到达最快请求的结束时间
avails.insert(q.top().second); //将处理此请求的服务器插入avails
q.pop();
}
if(avails.size() == 0){ //如果没有空闲服务器可以使用
continue; //无视本次请求
}
//反之则是有空闲服务器可以处理请求
int cur = *avails.begin(); //保存最小的服务器编号
auto iter = avails.lower_bound(i % k); //按照题目要求寻找第一个大于等于i%k的空闲服务器
if(iter != avails.end()){ //如果找到满足要求的空闲服务器
cur = *iter; //保存服务器编号
}
//反之则没有找到大于等于i%k的服务器,就用最小的服务器处理
q.push({t + load[i], cur}); //结束时间和服务器编号入堆
avails.erase(cur); //cur服务器进入繁忙状态
++cnt[cur]; //cur服务器处理的请求数量+1;
Maxuse = max(Maxuse, cnt[cur]); //保存最大的使用次数
}
vector<int> res; //定义返回值
for (int i = 0; i < k; ++i)
{
if (cnt[i] == Maxuse)
{
res.push_back(i);
}
}
return res;
}
};