可能有些条件没说明白吧,有一个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);
}