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);
}

你可能感兴趣的:(8-05. 银行排队问题之“多队列多窗口”版)