心态爆炸……
注意点:
1. 客户超出两小时要限制为两小时;
2. 有可能出现21点后到店的客户;
3. vip客户到店后会优先选择VIP桌,不论此时是否有普通桌空着。
#include <stdio.h>
#include <stdlib.h>
#include <cstdio>
#include <cstring>
#include <string>
#include <cstdlib>
#include <cmath>
#include <algorithm>
#include <iostream>
#include <math.h>
#include <map>
#include <vector>
#include <queue>
using namespace std;
const int inf=10000000;
struct table
{
int id;
bool vip;
int endtime;
int servenum;
int occupy;
table()
{
endtime=0;
servenum;
occupy=0;
}
}t[110];
struct player
{
int arrivetime;
int servetime;
int starttime;
int endtime;
bool vip;
bool play;
player()
{
play=false;
starttime=50000;
}
}c[10010];
queue<int> waitline;
queue<int> vipline;
queue<int> total;
int N,K,M,close=13*3600;
int opentable;
bool cmpc(player a,player b)
{
return a.arrivetime<b.arrivetime;
}
bool cmpt2(table a,table b)
{
if(a.occupy!=b.occupy)return a.occupy>b.occupy;
if(a.occupy==0)return a.id<b.id;
if(a.occupy==1)return a.endtime<b.endtime;
else return a.id<b.id;
}
bool cmpr(player a, player b)
{
return a.starttime<b.starttime;
}
bool cmptr(table a,table b)
{
return a.id<b.id;
}
int num=0,vipi=-1;
int nextvip(int now)
{
while(now<N)
{
now++;
if(c[now].vip==true)
break;
}
return now;
}
void fenpei(int tid,int pid)
{
t[tid].endtime=max(t[tid].endtime,c[pid].arrivetime)+min(7200,c[pid].servetime);
c[pid].endtime=t[tid].endtime;
c[pid].starttime=c[pid].endtime-min(7200,c[pid].servetime);
if(c[pid].starttime<close)
{
t[tid].servenum++;
}
}
int main()
{
scanf("%d",&N);
for(int i=0;i<N;i++)
{
int h,m,s;
scanf("%d:%d:%d",&h,&m,&s);
int temp=h*3600+m*60+s;
temp=temp-8*3600;
c[i].arrivetime=temp;
scanf("%d%d",&temp,&c[i].vip);
c[i].servetime=temp*60;
}
sort(c,c+N,cmpc);
for(int i=0;i<N;i++)
{
total.push(i);
}
scanf("%d%d",&K,&M);
opentable=K;
for(int i=0;i<K;i++)
{
t[i].id=i;
}
for(int i=0;i<M;i++)
{
int index;
scanf("%d",&index);
t[index-1].vip=true;
}
int index=0;
int clock=0;
vipi=nextvip(vipi);
while(num<N)
{
int tid=-1,MinEnd=inf;
for(int i=0;i<K;i++)
{
if(t[i].endtime<MinEnd)
{
MinEnd=t[i].endtime;
tid=i;
}
}
if(t[tid].endtime>=close)break;
if(c[num].vip==true&&vipi>num)
{
num++;
continue;
}
if(t[tid].vip==true)
{
if(c[num].vip==true)
{
fenpei(tid,num);
if(vipi==num)vipi=nextvip(vipi);
num++;
}
else
{
if(vipi<N&&c[vipi].arrivetime<=t[tid].endtime)
{
fenpei(tid,vipi);
vipi=nextvip(vipi);
}
else
{
fenpei(tid,num);
num++;
}
}
}
else
{
if(c[num].vip==false)
{
fenpei(tid,num);
num++;
}
else
{
int viptid=-1,minservetime=inf;
for(int i=0;i<K;i++)
{
if(t[i].vip==true&&t[i].endtime<minservetime)
{
minservetime=t[i].endtime;
viptid=i;
}
}
if(viptid!=-1&&t[viptid].endtime<=c[num].arrivetime)
{
fenpei(viptid,num);
if(vipi==num)vipi=nextvip(vipi);
num++;
}
else
{
fenpei(tid,num);
if(vipi==num)vipi=nextvip(vipi);
num++;
}
}
}
}
sort(c,c+N,cmpr);
for(int i=0;i<N;i++)
{
if(c[i].starttime<close)
{
double wait=c[i].starttime-c[i].arrivetime;
int h,m,s;
h=c[i].arrivetime/3600;
m=(c[i].arrivetime-3600*h)/60;
s=c[i].arrivetime%60;
printf("%02d:%02d:%02d",h+8,m,s);
printf(" ");
h=c[i].starttime/3600;
m=(c[i].starttime-3600*h)/60;
s=c[i].starttime%60;
printf("%02d:%02d:%02d",h+8,m,s);
printf(" ");
int waitt=(wait+30)*1.0/60;
printf("%d\n",waitt);
}
}
sort(t,t+K,cmptr);
for(int i=0;i<K;i++)
{
printf("%d",t[i].servenum);
if(i!=K-1)printf(" ");
}
system("pause");
return 0;
}