[leetcode]1606 找到处理最多请求的服务器,优先队列

题意

有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;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值