这个题目的大意是说有一个餐厅,里面有两人桌,四人桌,六人桌。
1-2名顾客坐两人桌,3-4名顾客坐四人桌,5-6名顾客坐六人桌。
每桌顾客吃饭要花半个小时,如果餐厅里没有空余的桌子给新顾客,新来的顾客最多可以等半个小时。
当新顾客来的时候,先看餐厅里有没有对应类型的空余的桌子,如果有,那么就直接落座。
如果没有,再看看在接下来的半小时内会不会出现空余的桌子(顾客吃完离开),只要新空出来的桌子一出现,就让等待中的顾客落座.
所以每一个桌子都应该有一个数据来记录它最近一次顾客吃完离开的时间,每当有新顾客落座时,就更新这个时间
#include <iostream>
using namespace std;
#include<string>
#include<vector>
#include <algorithm>
int TimeToInt(string time) {
int a=((time[0]-'0')*10+time[1]-'0')*60+(time[3]-'0')*10+(time[4]-'0');
return a;
}
class Table {
public:
int people;
int time;
Table(int people) {
this->people=people;
time=0;
}
bool noTable(int time) {
return (time+30)<this->time;
}
void updateTime(int time) {
if(time>this->time)this->time=time+30;
else this->time=this->time+30;
}
};
class Diner {
public:
int arrTime;
int peopleNum;
};
bool Compare(Table&a,Table&b) {
return a.time<b.time;
}
void serve(vector<Table>&table,Diner diner,int&count) {
sort(table.begin(),table.end(),Compare);
for(vector<Table>::iterator it1=table.begin(); it1!=table.end(); it1++) {
if(!it1->noTable(diner.arrTime)) {
it1->updateTime(diner.arrTime);
count+=diner.peopleNum;
break;
}
}
}
int main() {
int a,b,c;
while(cin>>a>>b>>c&&(a||b||c)) {
vector<Table> twoseat,fourseat,sixseat;
int count=0;
while(a--) {
twoseat.push_back(Table(2));
}
while(b--) {
fourseat.push_back(Table(4));
}
while(c--) {
sixseat.push_back(Table(6));
}
string t;
while(cin>>t&&t!="#") {
Diner din;
din.arrTime=TimeToInt(t);
cin>>din.peopleNum;
if(din.peopleNum<=2) {
serve(twoseat,din,count);
} else if(din.peopleNum<=4) {
serve(fourseat,din,count);
} else {
serve(sixseat,din,count);
}
}
cout<<count<<endl;
}
return 0;
}