题目描述

假设银行有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队列----银行单队列多窗口模拟的更多相关文章

  1. PTA 银行排队问题之单队列多窗口加VIP服务 队列+模拟

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

  2. 银行排队问题之单队列多窗口加VIP服务(30 分)

    银行排队问题之单队列多窗口加VIP服务(30 分) 假设银行有K个窗口提供服务,窗口前设一条黄线,所有顾客按到达时间在黄线后排成一条长龙.当有窗口空闲时,下一位顾客即去该窗口处理事务.当有多个窗口可选 ...

  3. PTA 银行排队问题之单队列多窗口服务(25 分)

    银行排队问题之单队列多窗口服务(25 分) 假设银行有K个窗口提供服务,窗口前设一条黄线,所有顾客按到达时间在黄线后排成一条长龙.当有窗口空闲时,下一位顾客即去该窗口处理事务.当有多个窗口可选择时,假 ...

  4. PTA 银行排队问题之单队列多窗口服务 (25分)

    PTA 银行排队问题之单队列多窗口服务 (25分) 假设银行有K个窗口提供服务,窗口前设一条黄线,所有顾客按到达时间在黄线后排成一条长龙.当有窗口空闲时,下一位顾客即去该窗口处理事务.当有多个窗口可选 ...

  5. PTA 银行排队问题之单队列多窗口服务

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

  6. javascript实现数据结构与算法系列:队列 -- 链队列和循环队列实现及示例

    1 队列的基本概念 队列(Queue):也是运算受限的线性表.是一种先进先出(First In First Out ,简称FIFO)的线性表.只允许在表的一端进行插入,而在另一端进行删除. 队首(fr ...

  7. 队列(Queue)--环形队列、优先队列和双向队列

    1. 队列概述 队列和堆栈都是有序列表,属于抽象型数据类型(ADT),所有加入和删除的动作都发生在不同的两端,并符合First In, First Out(先进先出)的特性. 特性: ·FIFO ·拥 ...

  8. 队列理论和队列网络模型 queueing theory and queueing network model

    1队列理论 1.1队列在生活中随处可见,例如排队买票,排队打饭,排队做地铁等等.那将诸如此类的队列抽象一下,可归纳为一下5要术: 到达过程arrival process 服务时间的分布 service ...

  9. 【Java】 大话数据结构(7) 循环队列和链队列

    本文根据<大话数据结构>一书,实现了Java版的循环队列.链队列. 队列:只允许在一端进行插入操作,而在另一端进行删除操作的线性表. 1.循环队列 队列的顺序储存结构:用数组存储队列,引入 ...

随机推荐

  1. 在 4GB 物理内存的机器上,申请 8G 内存会怎么样?

    作者:小林coding 计算机八股文刷题网站:https://xiaolincoding.com/ 大家好,我是小林. 看到读者在群里讨论这些面试题: 其中,第一个问题「在 4GB 物理内存的机器上, ...

  2. 利用Github Action实现Tornadofx/JavaFx打包

    原文地址: 利用Github Action实现Tornadofx/JavaFx打包 - Stars-One的杂货小窝 最近开了个新项目,主要是个工具软件,也算个人的自娱自乐吧,也算开源的一部分,想着都 ...

  3. python爬虫之JS逆向

    Python爬虫之JS逆向案例 由于在爬取数据时,遇到请求头限制属性为动态生成,现将解决方式整理如下: JS逆向有两种思路: 一种是整理出js文件在Python中直接使用execjs调用js文件(可见 ...

  4. C语言:如何给全局变量起一个别名?

    作 者:道哥,10+年嵌入式开发老兵,专注于:C/C++.嵌入式.Linux. 关注下方公众号,回复[书籍],获取 Linux.嵌入式领域经典书籍:回复[PDF],获取所有原创文章( PDF 格式). ...

  5. numpy中的np.round()取整的功能和注意

    numpy中的np.round()取整的功能和注意 功能 np.round() 是对浮点数取整的一个函数,一般的形式为 np.round(a, b),其中a为待取整的浮点数,b为保留的小数点的位数 注 ...

  6. 使用AndroidKiller进行APK反编译

    安装环境 JDK 最好用JDK8,问就是坑太多了 Android Studio 官网安装即可,安装教程如下 https://www.runoob.com/android/android-studio- ...

  7. Vue路由的模块自动化与统一加载

    首先呢,我们来看看一般项目路由是怎么划分的. 为什么这么划分呢?如果大项目业务非常多,单纯的单页面很难维护,我们只有这样规范化,才能高效率. 模块自动化与统一加载的好处: 规范化命名(模块名.业务名. ...

  8. SAP 日期计算

    1. CONVERSION_EXIT_IDATE_OUTPUT     INPUT:      20200601     OUTPUT:   03FEB2008 2. CONVERT_DATE_TO_ ...

  9. js 表面学习 - 认识事件

    事件 描述 onchange HTML 元素已被改变 onclick 用户点击了 HTML 元素 onmouseover 用户把鼠标移动到 HTML 元素上 onmouseout 用户把鼠标移开 HT ...

  10. sql server 跨IP库更新表字段(OPENDATASOURCE 、update)

    --跨ip库更新表字段 update uat set goodsType=dev.goodsType from OPENDATASOURCE('SQLOLEDB','Data Source=127.0 ...