欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

杭电OJ 1103(C++)

程序员文章站 2022-07-13 17:38:24
...
#include <iostream>
#include <queue>
#include <functional>
#include <string>
#include <algorithm>
using namespace std;

int a, b, c; //2人、4人、6人桌数量
int deskNum, time, people, ans; //使用桌子种类,到达时间,人数,最终输出
string s;

int main()
{
	while (cin >> a >> b >> c)
	{
		if (a + b + c == 0)
			break;
		ans = 0;
		//3种桌子的优先队列,按照到达时间从小到大排序
		priority_queue<int, vector<int>, greater<int> > p[3];
		//初始化3种桌子的优先队列
		for (int i = 0; i < a; i++) p[0].push(0);
		for (int i = 0; i < b; i++) p[1].push(0);
		for (int i = 0; i < c; i++) p[2].push(0);
		while (cin >> s)
		{
			if (s[0] == '#')
				break;
			//将到达时间转换为分钟
			time = 600 * s[0] + 60 * s[1] + 10 * s[3] + s[4] - '0' * 671;
			cin >> people;
			deskNum = (people - 1) / 2;
			int q = p[deskNum].top(); //此类桌子客人的最早离开时间
			if (q <= time + 30) //等待时间在30分钟以内
			{
				q = max(q, time) + 30; //当前客人预计离开时间
				if (q <= 23 * 60) //离开时间在23点之前
				{
					p[deskNum].pop();
					p[deskNum].push(q);
					ans += people;
				}
			}
		}
		cout << ans << endl;
	}
}

 

相关标签: 杭电OJ 杭电OJ