A (1080) : DS队列--银行单队列多窗口模拟


一、题目描述

假设银行有K个窗口提供服务,窗口前设一条黄线,所有顾客按到达时间在黄线后排成一条长龙。当有窗口空闲时,下一位顾客即去该窗口处理事务。当有多个窗口可选择时,假设顾客总是选择编号最小的窗口。

本题要求输出前来等待服务的N位顾客的平均等待时间、最长等待时间、最后完成时间。


二、输入与输出

1.输入

输入第1行给出正整数N(≤1000),为顾客总人数;

随后N行,每行给出一位顾客的到达时间T和事务处理时间P,并且假设输入数据已经按到达时间先后排好了顺序;最后一行给出正整数K(≤10),为开设的营业窗口数。

9
0 20
1 15
1 61
2 10
10 5
10 3
30 18
31 25
31 2
3

2.输出

在一行中输出平均等待时间(输出到小数点后1位)、最长等待时间、最后完成时间,之间用1个空格分隔,行末不能有多余空格。

6.2 17 62


三、参考代码

#include<iostream>
#include<queue>
#include<iomanip>
#include<math.h>
#include<stack>
using namespace std;
class Cus
{
public:
	int arr;
	int cost;
};
int main()
{
	int peo;
	cin >> peo;
	Cus* cus = new Cus[peo];
	for (int i = 0; i < peo; i++)
	{
		cin >> cus[i].arr >> cus[i].cost;
	}
	int k;
	cin >> k;
	int* window = new int[k];
	int sumt = 0, maxt = 0, overt = 0;
	for (int i = 0; i < k; i++) {
		window[i] = cus[i].arr + cus[i].cost;
	}

	queue<Cus>waiting;
	int gogo = 0;
	for (int i = k; i < peo; i++)
	{
		int flag = 1;
		gogo = window[0];
		for (int j = 0; j < k; j++) {
			if (window[j] < gogo) {
				gogo = window[j];
			}
		}
		if (cus[i].arr < gogo)
		{
			waiting.push(cus[i]);
		}
		else
		{
			while (cus[i].arr >= gogo && flag)
			{
				if (waiting.empty()) 
				{
					for (int j = 0; j < k; j++)
					{
						if (cus[i].arr == window[j])
						{
							window[j] += cus[i].cost;
							flag = 0;
							break;
						}
						else if (cus[i].arr > window[j])
						{
							window[j] = cus[i].arr + cus[i].cost;
							flag = 0;
							break;
						}
					}
					gogo = window[0];
					for (int j = 0; j < k; j++) {
						if (window[j] < gogo)
						{
							gogo = window[j];
						}
					}
				}
				else
				{
					sumt += gogo - waiting.front().arr;
					if (gogo - waiting.front().arr > maxt)
					{
						maxt = gogo - waiting.front().arr;
					}
					for (int j = 0; j < k; j++)
					{
						if (gogo == window[j])
						{
							window[j] = gogo + waiting.front().cost;
							break;
						}
					}
					waiting.pop();
					gogo = window[0];
					for (int j = 0; j < k; j++) {
						if (window[j] < gogo)
						{
							gogo = window[j];
						}
					}
					if (cus[i].arr < gogo)
					{
						waiting.push(cus[i]);
					}
				}
				
			}
		}
	}
	while (!waiting.empty())
	{
		sumt += gogo - waiting.front().arr;
		if (gogo - waiting.front().arr > maxt)
		{
			maxt = gogo - waiting.front().arr;
		}
		for (int j = 0; j < k; j++)
		{
			if (gogo == window[j])
			{
				window[j] = gogo + waiting.front().cost;
			}
		}
		waiting.pop();
	}
	for (int j = 0; j < k; j++)
	{
		if (window[j] > overt)
		{
			overt = window[j];
		}
	}

	cout << fixed << setprecision(1) << (sumt * 1.0) / peo << " " << maxt << " " << overt;

	return 0;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Z1Jxxx

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值