23分
#include <iostream>
#include <vector>
#include <queue>
#include <algorithm>
#include <climits>
using namespace std;
struct Customer{
int arriveTime;
int remainTime;
int waitTime;
bool vip;
bool serv;
};
struct Table{
int cusId;
int cusNum;
bool hasCus;
bool vip;
};
bool cmp(Customer a,Customer b){
return a.arriveTime < b.arriveTime;
}
vector<Customer> customers;
Table tables[100];
int cus = 0;
int n;
int serve(int curTime,int tableNum){
int minRemainTime = INT_MAX;
int curLastCum;//当前时间到达的最后一位顾客的下一个的编号
for(curLastCum = cus;curLastCum < n;curLastCum++){
if(customers[curLastCum].arriveTime > curTime){
break;
}
}
for(int i = 1;i <= tableNum;i++){
if(cus < curLastCum || tables[i].hasCus == true){
if(tables[i].hasCus == false){//当前桌子没有人
if(tables[i].vip == true){//当前桌子是vip,从已到达未服务的人中找到第一个vip,加入这个桌子,若未找到,则将已到达未服务第一个人加入这个桌子
int vipid = -1;
for(int j = cus;j < curLastCum;j++){//找第一个vip
if(customers[j].vip ==true && customers[j].serv == false){
vipid = j;
break;
}
}
if(vipid != -1){//找到第一个vip了
tables[i].cusId = vipid;
tables[i].cusNum++;
tables[i].hasCus = true;
customers[vipid].serv = true;
int arrivH,arrivM,arrivS,servH,servM,servS;
arrivH = customers[vipid].arriveTime / 3600;
arrivM = (customers[vipid].arriveTime - 3600 * arrivH) / 60;
arrivS = customers[vipid].arriveTime - 3600 * arrivH - 60 * arrivM;
servH = curTime / 3600;
servM = (curTime - servH * 3600) / 60;
servS = curTime - servH * 3600 - servM * 60;
if(customers[vipid].waitTime % 60 >= 30)
customers[vipid].waitTime = customers[vipid].waitTime / 60 + 1;
else customers[vipid].waitTime = customers[vipid].waitTime / 60;
printf("%02d:%02d:%02d %02d:%02d:%02d %d\n",arrivH,arrivM,arrivS,servH,servM,servS,customers[vipid].waitTime);
}else{//没找到
bool s = false;
while(s == false){
if(customers[cus].vip == true && customers[cus].serv == true)//若当前应该serve的顾客是之前已经serve过的vip客户,直接跳下一个客户
cus++;
else{//若不是,则serve
s = true;
tables[i].cusId = cus;
tables[i].cusNum++;
tables[i].hasCus = true;
customers[cus].serv = true;
int arrivH,arrivM,arrivS,servH,servM,servS;
arrivH = customers[cus].arriveTime / 3600;
arrivM = (customers[cus].arriveTime - 3600 * arrivH) / 60;
arrivS = customers[cus].arriveTime - 3600 * arrivH - 60 * arrivM;
servH = curTime / 3600;
servM = (curTime - servH * 3600) / 60;
servS = curTime - servH * 3600 - servM * 60;
if(customers[cus].waitTime % 60 <= 30)
customers[cus].waitTime = customers[cus].waitTime / 60 + 1;
else customers[cus].waitTime = customers[cus].waitTime / 60;
printf("%02d:%02d:%02d %02d:%02d:%02d %d\n",arrivH,arrivM,arrivS,servH,servM,servS,customers[cus].waitTime);
cus++;
}
}
}
}else{//当前桌子不是vip,将已到达未服务的第一个人加入这个桌子
//加入的时候直接输出:到达时间、服务时间、等待时间
bool s = false;
while(s == false){
if(customers[cus].vip == true && customers[cus].serv == true)//若当前应该serve的顾客是之前已经serve过的vip客户,直接跳下一个客户
cus++;
else if(cus < curLastCum){//若不是,则serve
s = true;
tables[i].cusId = cus;
tables[i].cusNum++;
tables[i].hasCus = true;
customers[cus].serv = true;
int arrivH,arrivM,arrivS,servH,servM,servS;
arrivH = customers[cus].arriveTime / 3600;
arrivM = (customers[cus].arriveTime - 3600 * arrivH) / 60;
arrivS = customers[cus].arriveTime - 3600 * arrivH - 60 * arrivM;
servH = curTime / 3600;
servM = (curTime - servH * 3600) / 60;
servS = curTime - servH * 3600 - servM * 60;
if(customers[cus].waitTime % 60 >= 30)
customers[cus].waitTime = customers[cus].waitTime / 60 + 1;
else customers[cus].waitTime = customers[cus].waitTime / 60;
printf("%02d:%02d:%02d %02d:%02d:%02d %d\n",arrivH,arrivM,arrivS,servH,servM,servS,customers[cus].waitTime);
cus++;
}
else s = true;
}
}
}
}
if(tables[i].hasCus == true && customers[tables[i].cusId].remainTime < minRemainTime){
minRemainTime = customers[tables[i].cusId].remainTime;
}
}
if(curLastCum < n && (customers[curLastCum].arriveTime - curTime) < minRemainTime){
minRemainTime = customers[curLastCum].arriveTime - curTime;
}
//再遍历一遍所有桌子,所有桌子对应的客人的remainTime都减minRemainTime,判断是否有等于0,有这个客人就离开桌子。
for(int i = 1;i <= tableNum;i++){
if(tables[i].hasCus == true){
customers[tables[i].cusId].remainTime -= minRemainTime;
if(customers[tables[i].cusId].remainTime == 0){
tables[i].cusId = -1;
tables[i].hasCus = false;
}
}
}
//再将所有等待中顾客的waitTime加minRemainTime
for(int i = cus;i < curLastCum;i++)
customers[i].waitTime += minRemainTime;
curTime += minRemainTime;
return curTime;
}
int main(){
scanf("%d",&n);
for(int i = 0;i < n;i++){
int h,m,s,serve;
bool v;
scanf("%d:%d:%d %d",&h,&m,&s,&serve);
cin>>v;
if(serve > 2 * 3600) serve = 2 * 3600;
int time = h * 3600 + m * 60 + s;
Customer temp;
temp.arriveTime = time;
temp.remainTime = serve * 60;
temp.waitTime = 0;
temp.vip = v;
temp.serv = false;
customers.push_back(temp);
}
int tableNum,vipNum;
scanf("%d %d",&tableNum,&vipNum);
for(int i = 1;i <= tableNum;i++){
tables[i].cusId;
tables[i].cusNum = 0;
tables[i].hasCus = false;
tables[i].vip = false;
}
for(int i = 0;i < vipNum;i++){
int v;
scanf("%d",&v);
tables[v].vip = true;
}
sort(customers.begin(),customers.end(),cmp);
int curTime = customers[0].arriveTime;
while(curTime < 21*3600)
curTime = serve(curTime,tableNum);
for(int i = 1;i < tableNum;i++){
printf("%d ",tables[i].cusNum );
}
printf("%d",tables[tableNum].cusNum );
system("pause");
return 0;
}