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.循环队列 队列的顺序储存结构:用数组存储队列,引入 ...
随机推荐
- js算法-计算素数暴力算法
- 软件构造Lab2实验总结
本次实验训练抽象数据类型(ADT)的设计.规约.测试,并使用面向对象编程(OOP)技术实现ADT.具体来说内容如下: 针对给定的应用问题,从问题描述中识别所需的ADT: 设计ADT规约(pre-con ...
- 物联网无线数传通信模块设备常见的几种Modbus网关
物联网无线数传通信常见的几种Modbus网关 以下提到Modbus网关均指Modbus RTU转Modbus TCP,并不涉及对Modbus ASCII数据帧的处理,Modbus ASCII仅支持透明 ...
- Django 学习记录(AcWing)
Django 2.1 搭建文件结构 前面的都是配置基本步骤,不需要理解,其他Django项目同样步骤操作: 接下来用Django-admin新建一个Django项目: django-admin sta ...
- JavaScript中用画布canvans做贪吃蛇
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Vue回炉重造之三次封装axios
源码目录 在src目录下建立一个request文件夹.里面建立两个文件: http.js api.js 源码内容 http.js import axios from 'axios' // 引入axio ...
- React技巧之字符串插值
原文链接:https://bobbyhadz.com/blog/react-string-interpolation 作者:Borislav Hadzhiev 正文从这开始~ 总览 在React中,使 ...
- centos7.6部署DRBD提示“no resources defined!
环境准备: node1(主节点)IP: 192.168.26.30 主机名:node1node2(从节点)IP: 192.168.26.31 主机名:node2 1.关闭防火墙和selinux #se ...
- SpringMVC-01
1. 概述 1.1 概念 SpringMVC是一种基于Java实现MVC模型的轻量级Web框架 优点 使用简单,开发便捷(相比于Servlet) 灵活性强 项目请求响应架构演进: 软件三层 软件三层 ...
- c# 添加指定扩展名的系统右键菜单(Windows11以前)
在上篇文章c# 添加系统右键菜单(Windows11以前)中我们说了怎么在文件夹上增加一个菜单项,但是我们可能还需要给某个单独的扩展名添加右键菜单. 这里我们不用常见的扩展名来做,我们新做一个.jx的 ...