8-05. 银行排队问题之“多队列多窗口”版

可能有些条件没说明白吧,有一个case没过,不过思路差不多就是这样,到来时把该离队的人都强制离队,此时有不满员的队伍就排队,否则队伍全满,找队头最先离开的那个队伍,强制其离队

#include<algorithm>
#include<iostream>
#include<list>
using namespace std;
const int N=10004,K=1003;
int come[N],cost[N],serve[N],n,k,m,len[K];
list<int>que[K];

int main(){
  cin>>n>>k>>m;
  for(int i=0;i<n;++i){
    cin>>come[i]>>cost[i];
    cost[i]=min(60,cost[i]); }
  for(int i=0;i<n;++i){
    for(int j=0;j<k;++j)
      while(!que[j].empty()&&que[j].front()<come[i])
      {que[j].pop_front();--len[j];}
    int nth=min_element(len,len+k)-len;
    if(que[nth].size()==m){
	for(int j=0,mmin=INT_MAX;j<k;++j)
	if(que[j].front()<mmin)
	  mmin=que[nth=j].front();
      que[nth].pop_front();
      serve[i]=max(come[i],que[nth].back());
    }else{
      serve[i]=come[i];
      if(!que[nth].empty())
	serve[i]=max(que[nth].back(),serve[i]);
      ++len[nth];
    }
    que[nth].push_back(serve[i]+cost[i]);
  }
  long double total=0;
  for(int i=0;i<n;++i)total+=serve[i]-come[i];
  printf("%.1lf",double(total)/n);
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值