根据输入,每进一批客人,更新一次 入座的桌子的时间
更新时间有两种情况
比如有餐馆只有一个两人桌 ,若第一批坐入这个位置,第二批恰好也要坐两人桌,就得等
1. |start----------insert------| 即insert的时间 < (在第一批客人进入(start处)+30)
2. |start----------------|------insert 即第一批人吃完了,第二批才来
综合 1,2得出 time of 第二批 > time of 第一批 就可以入座 更新该桌时间
只有 time of 第二批 < time of 第一批 为什么第二批来的人时间会小于第一批?因为这个桌子数组内的时间总是存这桌人入座的时间 ,有两组人来的时间很接近 比如这桌人12:50开始吃饭 我 1:00 来 你1:02 来 我1:20就可以入座 你就得等到1:50 即48分钟超过30 就走了 不能吃上饭的 只可能发生在要坐该桌的 有超过3批人以上
假设8:00一开始 设 为负值
时间更新(如果可更新)
time【桌子类型】【这种类型的桌子的第几号】= 1.这批客人在上批客人走后很久才到 入座时间==来的时间
or 2.来的时间还有人在桌上吃饭 那就等他们走 入座时间==他们走的时间
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
const int nmax=105;
int findmin(int* a,int len) //根据优先原则,等待的客人先进入最先吃完饭的桌子,即找最小时间
{
int index=0,v=a[0];
for(int i=0;i<len;i++)
{
if(v<0) //有个位置没人坐
break;
if(a[i]<v)
{
v=a[i];
index=i;
}
}
return index; //返回座位的的标号
}
int main(void)
{
int table[3]; //table[0]表示2人桌,其他两个表示4人桌,和6人桌
while(scanf("%d%d%d",&table[0],&table[1],&table[2])!=EOF)
{
if(table[0]+table[1]+table[2]==0) break;
int ans=0,kind; //ans为输出,kind是客人应该坐的桌子的种类
int timer[3][nmax]; //timer[0][0]表示2人桌0号开始吃饭的时间
memset(timer,-1,sizeof(timer)); //初始化
string comming;
while(cin>>comming&&comming!="#")
{
int v1,v2;
scanf("%d",&kind);
sscanf(comming.c_str(),"%d:%d",&v1,&v2);
int index=(kind-1)/2; //应该坐的桌子
int v=v1*60+v2; //将时间化为一个整数 h*60+m
int k=findmin(timer[index],table[index]); //找最早能入座的桌子
if(timer[index][k]<=v)
{
timer[index][k]=timer[index][k]+30>=v&&timer[index][k]>=0?timer[index][k]+30:v; //更新时间
ans+=kind;
}
}
cout<<ans<<endl;
}
return 0;
}