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

思路:根据每个任务有对应的开始时间和持续时间,用优先队列busy维护二元组(结束时间,服务器编号),按结束时间从早到晚排列。

根据任务分配规则,用红黑树free维护空闲服务器编号,根据编号从小到大排列。

#include<iostream>
#include<vector>
#include<set>
#include<queue>
#include<algorithm>
using namespace std;
class Solution {
public:
    vector<int> busiestServers(int k, vector<int>& arrival, vector<int>& load) {
        int Max=0;
        vector<int>cnts(k,0);//统计每个服务器处理的请求数
        set<int>free;//空闲服务器,按编号从小到大排列,用红黑树存储
        //set:set 中不允许重复的元素,每个元素在 set 中最多只能出现一次。
        //multiset:multiset 允许存储重复的元素,同一个值可以在 multiset 中出现多次。
        priority_queue<pair<int,int>,vector<pair<int,int>>,greater<>> busy;
        //根据 pair 对象的第一个元素进行排序,并根据其值的大小获取最小的元素
        for(int i=0;i<=k-1;i++){
            free.insert(i);
        }
        for(int i=0;i<arrival.size();i++){
            int start=arrival[i],end=arrival[i]+load[i];
            //根据时间调整free和busy
            while(!busy.empty()&&busy.top().first<=start){
                free.insert(busy.top().second);
                busy.pop();
            }
            if(free.empty()==true){
                continue;
            }
            //找空闲服务器
            auto it=free.lower_bound(i%k);
            //第(i%k)个服务器非空闲,将请求安排给下一个空闲的服务器,所以用lower_bound,不能用find
            int u;
            if(it!=free.end()){
                u=*it;
                cnts[u]++;
                Max=max(Max,cnts[u]);
                busy.emplace(end,u);
                free.erase(it);
            }
            else{
                auto t=free.begin();
                u=*t;
                cnts[u]++;
                Max=max(Max,cnts[u]);
                busy.emplace(end,u);
                free.erase(t);
            }
            /*
            if(it==free.end()){
                it=free.begin();
            }
            cnts[*it]++;
            busy.emplace(end,*it);
            free.erase(it);
            */
        }
        vector<int>res;
        //int Max=*max_element(cnts.begin(),cnts.end());
        for(int i=0;i<k;i++){
            if(cnts[i]==Max){
                res.push_back(i);
            }
        }
        return res;

    }
};

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值