思路:
对于每一秒进行监控,进行送客入队迎客操作,根据桌子(银行窗口)空闲状态送客,根据玩家的come_time入队,根据桌子空闲状态和队列空闲状态迎客。
迎客时先处理vip队列再处理正常队列,vip即在vip队列也在正常队列,故对桌子遍历时要把队列中已经分配的玩家进行处理。
代码:
// N:玩家数
// come_time play_time isvip
// K 桌子数 vip桌子数
// vip桌子序号(从1开始)
#include<iostream>
#include<queue>
#include<algorithm>
#include<cstdio>
using namespace std;
struct player{
int isvip=0,come_time,serve_time,
leave_time=0,play_time;
};
struct table{
int isvip=0,player=-1;
int serve_person=0;
};
player p[10000];
table t[101];
bool comp(player x,player y){
return x.come_time<y.come_time;
}
int main(){
int N,K,M;
int i,j,k;
cin>>N;
for(i=0;i<N;i++){
int hh,mm,ss;
char c;
cin>>hh>>c>>mm>>c>>ss>>p[i].play_time>>p[i].isvip;
p[i].come_time=hh*3600+mm*60+ss;
p[i].play_time*=60;
if(p[i].play_time>7200) p[i].play_time=7200;
}
cin>>K>>M;
for(i=0;i<M;i++){
cin>>k;
t[k].isvip=1;
}
queue<int>q;
queue<int>qvip;
sort(p,p+N,comp);
int cur=0;
for(int Time=28800;Time<75600;Time++){
for(i=1;i<=K;i++){
j=t[i].player;
if(j!=-1&&p[j].leave_time==Time){
t[i].player=-1;
}//时间到了
}//送客
for(i=cur;i<N;i++){
if(p[cur].come_time<=Time&&p[cur].come_time>=28800){
q.push(cur);
if(p[cur].isvip==1){
qvip.push(cur);
}
cur++;
}//顾客中到了的就可以入队
}//入队
for(i=1;i<=K;i++){
while(qvip.size()!=0&&p[qvip.front()].leave_time!=0)
qvip.pop();
if(qvip.size()) j=qvip.front();
else break;
if(t[i].isvip==1&&t[i].player==-1){
t[i].player=j;
t[i].serve_person++;
p[j].serve_time=Time;
p[j].leave_time=Time+p[j].play_time;
printf("%02d:%02d:%02d %02d:%02d:%02d %d\n",
p[j].come_time/3600,p[j].come_time/60%60,p[j].come_time%60,
p[j].serve_time/3600,p[j].serve_time/60%60,p[j].serve_time%60,
(p[j].serve_time-p[j].come_time+30)/60);
qvip.pop();
}
}
for(i=1;i<=K;i++){
while(q.size()!=0&&p[q.front()].leave_time!=0)
q.pop();
if(q.size()) j=q.front();
else break;
if(t[i].player==-1){
t[i].player=j;
t[i].serve_person++;
p[j].serve_time=Time;
p[j].leave_time=Time+p[j].play_time;
printf("%02d:%02d:%02d %02d:%02d:%02d %d\n",
p[j].come_time/3600,p[j].come_time/60%60,p[j].come_time%60,
p[j].serve_time/3600,p[j].serve_time/60%60,p[j].serve_time%60,
(p[j].serve_time-p[j].come_time+30)/60);
q.pop();
}
}//迎客
}
for(i=1;i<=K;i++){
cout<<t[i].serve_person;
if(i!=K) cout<<' ';
}
cout<<endl;
}