HDU1103

	这个题目的大意是说有一个餐厅,里面有两人桌,四人桌,六人桌。
	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;//这个桌子是几人桌,2或4或6
		int time;//最近一次顾客吃完离开的时间
		Table(int people) {//构造函数
			this->people=people;
			time=0;
		}
		bool noTable(int time) {//判断新来的顾客是否能在这张桌子上吃饭
			return 	(time+30)<this->time;
		}
		void updateTime(int time) {
		//如果顾客在这张桌子上落座了,就更新桌子类所维护的时间
		//两种情况
		//1.新顾客来的时候,这张桌子没人,
		//那么落座时间为新顾客来的时间
		//2.新顾客来的时候,这张桌子有人,但在半小时之内就吃完离开了
		//那么落座时间为旧顾客离开的时间
			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;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值