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

题目

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

题目大意

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

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

给你一个 严格递增 的正整数数组 arrival ,表示第 i 个任务的到达时间,和另一个数组 load ,其中 load[i] 表示第 i 个请求的工作量(也就是服务器完成它所需要的时间)。你的任务是找到 最繁忙的服务器 。最繁忙定义为一个服务器处理的请求数是所有服务器里最多的。

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

样例

示例 1:

img

输入:k = 3, arrival = [1,2,3,4,5], load = [5,2,3,3,3] 
输出:[1] 
解释:
所有服务器一开始都是空闲的。
前 3 个请求分别由前 3 台服务器依次处理。
请求 3 进来的时候,服务器 0 被占据,所以它呗安排到下一台空闲的服务器,也就是服务器 1 。
请求 4 进来的时候,由于所有服务器都被占据,该请求被舍弃。
服务器 0 和 2 分别都处理了一个请求,服务器 1 处理了两个请求。所以服务器 1 是最忙的服务器。

示例 2:

输入:k = 3, arrival = [1,2,3,4], load = [1,2,1,2]
输出:[0]
解释:
前 3 个请求分别被前 3 个服务器处理。
请求 3 进来,由于服务器 0 空闲,它被服务器 0 处理。
服务器 0 处理了两个请求,服务器 1 和 2 分别处理了一个请求。所以服务器 0 是最忙的服务器。

示例 3:

输入:k = 3, arrival = [1,2,3], load = [10,12,11]
输出:[0,1,2]
解释:每个服务器分别处理了一个请求,所以它们都是最忙的服务器。

示例 4:

输入:k = 3, arrival = [1,2,3,4,8,9,10], load = [5,2,10,3,1,2,2]
输出:[1]

示例 5:

输入:k = 1, arrival = [1], load = [1]
输出:[0]

数据规模

提示:

  • 1 < = k < = 1 0 5 1 <= k <= 10^5 1<=k<=105
  • 1 < = a r r i v a l . l e n g t h , l o a d . l e n g t h < = 1 0 5 1 <= arrival.length, load.length <= 10^5 1<=arrival.length,load.length<=105
  • a r r i v a l . l e n g t h = = l o a d . l e n g t h arrival.length == load.length arrival.length==load.length
  • 1 < = a r r i v a l [ i ] , l o a d [ i ] < = 1 0 9 1 <= arrival[i], load[i] <= 10^9 1<=arrival[i],load[i]<=109
  • arrival 保证 严格递增

思路

定义一个set<int>f用来保存当前空闲的服务器;定义优先队列q其中每一个元素是一个pair<int,int>记录请求的结束时间和该请求占用的服务器。

初始时刻,使用的服务器都是空闲的,可以添加到f中。对于每一个请求的到来,首先需要把q中的占用服务器清理一部分(如果请求已经完成,就需要将服务器从q中去除,并且将它添加到f中),如果当前没有空闲的服务器就continue,即当前请求被舍弃,考虑下一个请求,找到空闲服务器中第一个 ≥ k \geq k k的服务器,如果没有,那么就从第 0 0 0个服务器开始找到满足空闲的服务器,即从f.begin()开始查找,找到之后需要对服务器的请求执行数量 + 1 +1 +1操作,然后将占用服务器的编号以及结束时间入队,并且f需要去掉占用的服务器。

最后找到请求执行数量最大的值maxx,然后遍历所有的服务器,如果服务器的请求执行数量等于maxx ,则加入到答案数组ans 中,最后返回ans

  • 时间复杂度: O ( ( k + n ) log ⁡ k ) O((k + n) \log k) O((k+n)logk)
  • 空间复杂度: O ( k ) O(k) O(k)

代码

// short int long float double bool char string void
// array vector stack queue auto const operator
// class public private static friend extern 
// sizeof new delete return cout cin memset malloc
// relloc size length memset malloc relloc size length
// for while if else switch case continue break system
// endl reverse sort swap substr begin end iterator
// namespace include define NULL nullptr exit equals 
// index col row arr err left right ans res vec que sta
// state flag ch str max min default charray std
// maxn minn INT_MAX INT_MIN push_back insert
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int>PII;
typedef pair<int, string>PIS;
const int maxn=5e4+50;//注意修改大小
long long read(){long long x=0,f=1;char c=getchar();while(!isdigit(c)){if(c=='-') f=-1;c=getchar();}while(isdigit(c)){x=x*10+c-'0';c=getchar();}return x*f;}
ll qpow(ll x,ll q,ll Mod){ll ans=1;while(q){if(q&1)ans=ans*x%Mod;q>>=1;x=(x*x)%Mod;}return ans%Mod;}

class Solution {
public:
    vector<int> busiestServers(int k, vector<int>& arrival, vector<int>& load) {
		set<int>f;
		vector<int>t(k);
		priority_queue<PII,vector<PII>,greater<PII>>q;
		for(int i=0;i<k;i++)f.insert(i);
		for(int i=0;i<arrival.size();i++){
			while(q.size()&&q.top().first<=arrival[i]){
				f.insert(q.top().second);
				q.pop();
			}
			if(f.empty())continue;
			auto it=f.lower_bound(i%k);
			if(it==f.end()){
				it=f.begin();
			}
			t[*it]++;
			q.push(make_pair(arrival[i]+load[i],*it));
			f.erase(it);
		}
		int maxx=*max_element(t.begin(),t.end());
		vector<int>ans;
		for(int i=0;i<k;i++){
			if(t[i]==maxx){
				ans.push_back(i);
			}
		}
		return ans;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Phoenix_ZengHao

创作不易,能否打赏一瓶饮料?

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值