找到处理最多请求的服务器

题目

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

第 i (序号从 0 开始)个请求到达。
如果所有服务器都已被占据,那么该请求被舍弃(完全不处理)。
如果第 (i % k) 个服务器空闲,那么对应服务器会处理该请求。
否则,将请求安排给下一个空闲的服务器(服务器构成一个环,必要的话可能从第 0 个服务器开始继续找下一个空闲的服务器)。比方说,如果第 i 个服务器在忙,那么会查看第 (i+1) 个服务器,第 (i+2) 个服务器等等。
给你一个 严格递增 的正整数数组 arrival ,表示第 i 个任务的到达时间,和另一个数组 load ,其中 load[i] 表示第 i 个请求的工作量(也就是服务器完成它所需要的时间)。你的任务是找到 最繁忙的服务器 。最繁忙定义为一个服务器处理的请求数是所有服务器里最多的。

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

链接:https://leetcode-cn.com/problems/find-servers-that-handled-most-number-of-requests

思路

集合、哈希表、优先队列、二分查找、模拟

代码

struct cmp{
	 
	    bool  operator ()  ( pair<int,int>  a , pair<int,int> b){
	   	      
                 return a.first > b.first;
	   } 
};
class Solution {
public:
    vector<int> busiestServers(int k, vector<int>& arrival, vector<int>& load) {


        set<int> available;
        // 可用服务器列表

        for(int i=0;i<k;i++)
        available.insert(i);

        priority_queue<pair<int,int>,vector<pair<int,int>>,cmp> q;
        // 记录服务器的结束时间和服务器编号

        vector<int> requests(k,0);
        // 服务器的使用次数

        for(int i=0;i<arrival.size();i++){


            while(!q.empty()&&q.top().first<=arrival[i]){
                available.insert(q.top().second);
                q.pop();
            }

            if(available.empty())
            continue;

           auto p=available.lower_bound(i%k);     // 需要使用二分查找

           if(p==available.end())
            p=available.begin();

            requests[*p]++;
            q.push(make_pair(arrival[i]+load[i],*p));
            available.erase(p);
        }

        int max_time=0;
        vector<int> ans;

        for(int i=0;i<k;i++){

            if(requests[i]==max_time){
                ans.push_back(i);
            }else if(requests[i]>max_time){

                max_time=requests[i];
                ans.clear();
                ans.push_back(i);
            }

        }


        return ans;

    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值