DS队列----银行单队列多窗口模拟
题目描述
假设银行有K个窗口提供服务,窗口前设一条黄线,所有顾客按到达时间在黄线后排成一条长龙。当有窗口空闲时,下一位顾客即去该窗口处理事务。当有多个窗口可选择时,假设顾客总是选择编号最小的窗口。
本题要求输出前来等待服务的N位顾客的平均等待时间、最长等待时间、最后完成时间。
输入
输入第1行给出正整数N(≤1000),为顾客总人数;随后N行,每行给出一位顾客的到达时间T和事务处理时间P,并且假设输入数据已经按到达时间先后排好了顺序;最后一行给出正整数K(≤10),为开设的营业窗口数。
输出
在一行中输出平均等待时间(输出到小数点后1位)、最长等待时间、最后完成时间,之间用1个空格分隔,行末不能有多余空格。
样例输入
9
0 20
1 15
1 61
2 10
10 5
10 3
30 18
31 25
31 2
3
样例输出
6.2 17 62
思路:
将顾客定义为一个队列,同时将每个窗口也都定义为队列。设置循环判断顾客队列是否为空,如果不为空就执行窗口队列的push操作,更新窗口队列的front为该窗口顾客任务的完成时间。每次选择窗口的时候都比较哪个窗口的完成时间最小,然后选择该窗口进行push。
代码:
#include<iostream>
#include<queue>
#include <iomanip>
using namespace std;
int main() {
	int n;
	cin >> n;
	queue<int>** peo = new queue<int> * [n];
	int atime, protime;
	for (int i = 0; i < n; i++) {
		peo[i] = new queue<int>[2];
		cin >> atime >> protime;
		peo[i][0].push(atime);
		peo[i][1].push(protime);
	}
	int k;
	cin >> k;
	queue<int>* win = new queue<int>[k];
	int waittime = 0;
	int maxwait = 0;
	int endtime = 0;
	double wait = 0;
	int waitpeo = 0;
	for (int i = 0; i < n; i++) {
		int flag = 0;
		if (!peo[i]->empty()) {
			for (int j = 0; j < k; j++) {
				if (win[j].empty()) {
					flag = 1;
					win[j].push(peo[i][0].front() + peo[i][1].front());
					if (peo[i][0].front() + peo[i][1].front() > endtime) {
						endtime = peo[i][0].front() + peo[i][1].front();
					}
					peo[i]->pop();
					break;
				}
				else {
					continue;
				}
			}
			if (flag == 0) {
				int mintime = 999;
				int minwin = -1;
				for (int j = 0; j < k; j++) {
					if (win[j].front() < mintime) {
						mintime = win[j].front();
						minwin = j;
					}
				}if (win[minwin].front() - peo[i][0].front() > maxwait) {
					maxwait = win[minwin].front() - peo[i][0].front();
				}
				if (win[minwin].front() - peo[i][0].front() > 0) {
					waittime += win[minwin].front() - peo[i][0].front();
					waitpeo++;
					win[minwin].front() += peo[i][1].front();
				}
				else {
					win[minwin].pop();
					win[minwin].push(peo[i][0].front() + peo[i][1].front());
				}
				peo[i]->pop();
			}
		}
	}
	for (int i = 0; i < k; i++) {
		if (endtime < win[i].front()) {
			endtime = win[i].front();
		}
	}
	wait = (double)waittime / n;
	cout << fixed << setprecision(1) << wait << ' ' << maxwait << ' ' << endtime << endl;
	return 0;
}
DS队列----银行单队列多窗口模拟的更多相关文章
- PTA 银行排队问题之单队列多窗口加VIP服务 队列+模拟
		假设银行有K个窗口提供服务,窗口前设一条黄线,所有顾客按到达时间在黄线后排成一条长龙.当有窗口空闲时,下一位顾客即去该窗口处理事务.当有多个窗口可选择时,假设顾客总是选择编号最小的窗口. 有些银行会给 ... 
- 银行排队问题之单队列多窗口加VIP服务(30 分)
		银行排队问题之单队列多窗口加VIP服务(30 分) 假设银行有K个窗口提供服务,窗口前设一条黄线,所有顾客按到达时间在黄线后排成一条长龙.当有窗口空闲时,下一位顾客即去该窗口处理事务.当有多个窗口可选 ... 
- PTA   银行排队问题之单队列多窗口服务(25 分)
		银行排队问题之单队列多窗口服务(25 分) 假设银行有K个窗口提供服务,窗口前设一条黄线,所有顾客按到达时间在黄线后排成一条长龙.当有窗口空闲时,下一位顾客即去该窗口处理事务.当有多个窗口可选择时,假 ... 
- PTA 银行排队问题之单队列多窗口服务 (25分)
		PTA 银行排队问题之单队列多窗口服务 (25分) 假设银行有K个窗口提供服务,窗口前设一条黄线,所有顾客按到达时间在黄线后排成一条长龙.当有窗口空闲时,下一位顾客即去该窗口处理事务.当有多个窗口可选 ... 
- PTA 银行排队问题之单队列多窗口服务
		假设银行有K个窗口提供服务,窗口前设一条黄线,所有顾客按到达时间在黄线后排成一条长龙.当有窗口空闲时,下一位顾客即去该窗口处理事务.当有多个窗口可选择时,假设顾客总是选择编号最小的窗口. 本题要求输出 ... 
- javascript实现数据结构与算法系列:队列 -- 链队列和循环队列实现及示例
		1 队列的基本概念 队列(Queue):也是运算受限的线性表.是一种先进先出(First In First Out ,简称FIFO)的线性表.只允许在表的一端进行插入,而在另一端进行删除. 队首(fr ... 
- 队列(Queue)--环形队列、优先队列和双向队列
		1. 队列概述 队列和堆栈都是有序列表,属于抽象型数据类型(ADT),所有加入和删除的动作都发生在不同的两端,并符合First In, First Out(先进先出)的特性. 特性: ·FIFO ·拥 ... 
- 队列理论和队列网络模型 queueing theory and queueing network model
		1队列理论 1.1队列在生活中随处可见,例如排队买票,排队打饭,排队做地铁等等.那将诸如此类的队列抽象一下,可归纳为一下5要术: 到达过程arrival process 服务时间的分布 service ... 
- 【Java】 大话数据结构(7) 循环队列和链队列
		本文根据<大话数据结构>一书,实现了Java版的循环队列.链队列. 队列:只允许在一端进行插入操作,而在另一端进行删除操作的线性表. 1.循环队列 队列的顺序储存结构:用数组存储队列,引入 ... 
随机推荐
- 3. Docker应用
- camunda BPM支持的开发和运行环境
			以Camunda7.13版本为例,介绍Camunda支持的开发运行环境. 一.支持的Java开发环境 • Java版本: 8 / 9 / 10 / 11 / 12 / 13 / 14• Springb ... 
- PHP时间轴函数
			PHP时间轴函数可以更好的去进行用户体验.让用户动态的知道最近是什么时候,而不是死板的datatime去转换成固定的时间. 后续版本会考虑添加这个功能,代码先贴出来. function tranTim ... 
- JS数组at函数(获取最后一个元素的方法)介绍
			本文介绍js中数组的at函数,属于比较简单的知识普及性文章,难度不大. 0x00 首先,我们可以思考如下一个问题,如果要获取一个数组的最后一个元素(这是很常用的操作),我们应该怎么做? 相信大部分人能 ... 
- 推荐一款M1芯片电脑快速搭建集群的虚拟机软件
			虚拟机软件太多了,出名的莫过于VMware,VirutlaBox以及Parallels Desktop. 我们使用虚拟机软件一般有两种用途: 安装不同于宿主机系统的拥有用户界面的操作系统,比如Wind ... 
- HashMap1.8常见面试问题
			1.hashmap转红黑树的时机: for (int binCount = 0; ; ++binCount) { if ((e = p.next) == null) { p.next = newNod ... 
- VisionPro · C# · 卸载相机
			在项目程序关闭前,需要将之前链接上的相机全部卸载,否则,关闭程序将出现弹窗报错. 解决报错,卸载相机代码如下: using System; using System.Windows.Forms; us ... 
- cmd命令与bat编程
			命令解压缩文件 winrar 命令行解压文件 winrar x 要解压的文件 要解压到的路径 (保存压缩文件内的目录结果) 直接覆盖 -o+ 覆盖已存在文件 在不提示 ... 
- NC15975 小C的记事本
			NC15975 小C的记事本 题目 题目描述 小C最近学会了java小程序的开发,他很开心,于是想做一个简单的记事本程序练练手. 他希望他的记事本包含以下功能: 1.append(str),向记事本插 ... 
- 记录一次ubuntu安装mysql,远程无法登录问题的解决历程
			进入ubuntu的mysql配置文件 sudo vim debian.cnf [client] host = localhost user = debian-sys-maint password = ... 
