其他分享
首页 > 其他分享> > LeetCode 1606. 找到处理最多请求的服务器(堆+set)

LeetCode 1606. 找到处理最多请求的服务器(堆+set)

作者:互联网

题意:

你有 k 个服务器,编号为 0 到 k-1 ,它们可以同时处理多个请求组。
每个服务器有无穷的计算能力但是 不能同时处理超过一个请求 。请求分配到服务器的规则如下:

第 i (序号从 0 开始)个请求到达。
如果所有服务器都已被占据,那么该请求被舍弃(完全不处理)。
如果第 (i % k) 个服务器空闲,那么对应服务器会处理该请求。
否则,将请求安排给下一个空闲的服务器
(服务器构成一个环,必要的话可能从第 0 个服务器开始继续找下一个空闲的服务器)。

比方说,如果第 i 个服务器在忙,那么会查看第 (i+1) 个服务器,第 (i+2) 个服务器等等。
给你一个 严格递增 的正整数数组 arrival ,表示第 i 个任务的到达时间,
和另一个数组 load ,其中 load[i] 表示第 i 个请求的工作量(也就是服务器完成它所需要的时间)。

你的任务是找到 最繁忙的服务器 。最繁忙定义为一个服务器处理的请求数是所有服务器里最多的。

请你返回包含所有 最繁忙服务器 序号的列表,你可以以任意顺序返回这个列表。

数据范围:
1 <= k <= 1e5
1 <= arrival.length, load.length <= 1e5
arrival.length == load.length
1 <= arrival[i], load[i] <= 1e9
arrival 保证 严格递增 。

解法:

开一个优先队列存储当前运行中的每个服务器的结束时间,
开一个set存储当前空闲的服务器.

当每个请求到来时,将运行中的 服务器结束时间<=当前请求到来时间 的服务器转为空闲,
然后再set中二分找到当前要用的服务器,
如果没二分出结果,说明需要循环到头部,改为使用set头部的空闲服务器.

code:

#define PI pair<int,int>
class Solution {
public:
    vector<int> busiestServers(int k, vector<int>& a, vector<int>& b) {
        int n=a.size();
        priority_queue<PI,vector<PI>,greater<PI> >q;//(end_time,idx)
        set<int>s;//空闲服务器
        vector<int>d(k,0);
        for(int i=0;i<k;i++){
            s.insert(i);
        }
        for(int i=0;i<n;i++){
            int now=a[i];
            while(q.size()&&q.top().first<=now){
                int t=q.top().second;
                q.pop();
                s.insert(t);
            }
            if(!s.size())continue;
            int t=i%k;
            auto it=s.lower_bound(t);
            if(it==s.end()){
                it=s.begin();
            }
            q.push({a[i]+b[i],*it});
            d[*it]++;
            s.erase(it);
        }
        int ma=0;
        for(int i=0;i<k;i++)ma=max(ma,d[i]);
        vector<int>ans;
        for(int i=0;i<k;i++){
            if(d[i]==ma){
                ans.push_back(i);
            }
        }
        return ans;
    }
};

标签:set,请求,int,1606,vector,服务器,LeetCode,空闲,size
来源: https://blog.csdn.net/weixin_44178736/article/details/114311922