题意
有k个服务器,能处理请求,同一时间只能处理一个请求,arrival
数组表示有arrival.size()
个请求,arrival[i]表示第i个请求到达的时间,而load[i]表示第i个请求需要处理的时间。arrival
严格单调递增。
如果第i个请求到达的时候,所有服务器都在处理其他请求,则第i个请求舍弃、不处理。
第i个请求到达的时候,优先找第(i%k)
个服务器,如果该服务器已经被占用,则去找第(i+1)%k
个服务器,若还是被占用就找(i+2)%k
个服务器,依次类推,直到发现全部被占用则舍去。
题目要求的是服务器处理请求次数最多的一个或多个,多个的时候顺序任意。
思路
要知道,前k个请求一定的按照i去一一对应的,k之后才会去考虑是否被占用。先用一个优先队列存下空闲的服务器id,另一个优先队列用来保存忙碌的服务器(这里存的不是id),保存忙碌的服务器,需要记录它的任务完成时间,并保存一个与id同余的数字,而且这个数字与请求i有关。
然后在遍历每个请求的时候,检查是否完全被强占,再检查最适合的id,累计每个服务器的处理请求个数,然后记录最大值,到最后在输出结果。
代码
class Solution {
public:
vector<int> busiestServers(int k, vector<int>& arrival, vector<int>& load) {
priority_queue<int,vector<int>,greater<int>> kongxian;
for(int i= 0;i< k; ++i) kongxian.push(i);
priority_queue<pair<int,int>, vector<pair<int,int>>,greater<pair<int,int>>> mang;
vector<int> num(k,0);
int maxNum=0;
int n = arrival.size();
for(int i = 0;i < n; ++i){
while(!mang.empty() && mang.top().first <= arrival[i]){
auto[x,y] = mang.top();
mang.pop();
kongxian.push(i + ((y-i) % k + k )%k);//zhongdian
}
if(kongxian.empty())continue;
int id = kongxian.top() % k;
kongxian.pop();
mang.push({arrival[i]+load[i],id});
++num[id];
maxNum = max(maxNum,num[id]);
}
vector<int> ans;
for(int i = 0;i< k; ++i){
if(num[i] == maxNum) ans.push_back(i);
}
return ans;
}
};