1014 Waiting in Line (30分)

本文介绍了一个银行排队系统的模拟实现,通过模拟时间演进,管理银行窗口的客户排队和服务过程,确保每位客户能在银行关门之前得到服务,否则返回Sorry。代码使用C++实现,涉及数据结构如向量和循环控制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目链接

题目大意

模拟一个银行等待队列,银行有n个窗口,每个窗口前有m个位置,不能进入位置的客户按照顺序id等待,当有位置空出时进入,给出被询问客户的服务完成时间。
注意:银行在17:00关门,不能在此前被服务的人只能"Sorry"了。
注意注意注意:这里是指在17:00未被服务,若服务已经开始,便将服务完成。

思路

用一个循环模拟时间演进,服务完一个客户就让下一个客户进入排队。

代码如下

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<vector>
using namespace std;

void print_time(int t)
{	//时间输出函数
	if (t == -1)
	{
		printf("Sorry\n");
		return;
	}
	int h, m;
	h = t / 60 + 8;
	m = t % 60;
	printf("%02d:%02d\n", h, m);
}
int main() {
	int n, m, k, q;
	cin >> n >> m >> k >> q;
	vector<vector<int> > bank(n, vector<int>(m));//银行窗口
	vector<vector<int> > server_customer_id(n, vector<int>(m));//记录当前服务客户的id
	vector<int> use_time(k + 1);
	vector<int> end_time(k + 1,-1);//-1标记未能服务
	for (int i = 1; i <= k; i++)
		scanf("%d", &use_time[i]);
	int customer_id = 1, now_time = 0;
	for(int j = 0;j < m;j++)
		for (int i = 0; i < n; i++)
		{
			if (customer_id <= k)//应对客户少于窗口数
			{
				server_customer_id[i][j] = customer_id;
				bank[i][j] = use_time[customer_id++];
			}
		}

	bool server_over;
	while (++now_time <= 540)
	{
		server_over = true;//记录是否全部客户服务完成
		for (int i = 0; i < n; i++)
		{
			if (bank[i].size())
			{	//窗口i仍有客户
				server_over = false;
				bank[i][0]--;
				if (bank[i][0] == 0)
				{
					end_time[server_customer_id[i][0]] = now_time;
					server_customer_id[i].erase(server_customer_id[i].begin());
					bank[i].erase(bank[i].begin());

					if (customer_id <= k)//客户数为k
					{
						server_customer_id[i].push_back(customer_id);
						bank[i].push_back(use_time[customer_id++]);
					}
				}
			}
		}
		if (server_over)
			break;		
	}

	for (int i = 0; i < n; i++)
	{
		if (bank[i].size() && bank[i][0] != use_time[server_customer_id[i][0]])
		{	//处理17:00时已经开始服务的客户
			end_time[server_customer_id[i][0]] = 540 + bank[i][0];
		}
	}

	for (int i = 1; i <= q; i++)
	{
		scanf("%d", &customer_id);
		print_time(end_time[customer_id]);
	}
	return 0;
}

/*
2 2 7 5
1 2 6 4 3 533 2
3 4 5 6 7

*/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值