PAT甲级-1014 Waiting in Line

embedded/2025/1/23 17:46:03/

题目

题目大意

一个银行有n个窗口,每个窗口最多站m个人,其余人在黄线外等候。假设k个人同时进入银行按先后次序排队,每个人都有相应的服务时间。每个顾客都选择最短队列站,如果有多个相同长度的队列,按序号小的站。给出要查询的人的序号,要求输出该人结束服务的时间。如果顾客开始服务的时间晚于17:00,则输出Sorry。

思路

银行排队问题,根据题目模拟。先考虑数据结构,根据题目很容易想出队列,这里我直接用m行n列的二维数组来表示黄线内的位置,后续模拟先进先出的操作,也可以用vector<queue>来表示。

然后考虑计算方法,黄线内和黄线外的人选择位置的算法是不一样的。黄线内的人不需要等待,一个萝卜一个坑地按序就座。但黄线外的人由于前面的位置已满,需要等某一个人出来再站空位置上。怎么知道哪个窗口的人先出来,就要看每一个队列中第一个人服务完成需要的时间。

找到首元素时间最小的那个队列,假设时间为t,让该元素出队,下一个人就能入队。出队就意味着此时已经过了t时间,因此其余队列的首元素都要减去t,按照题目中给的例子,如下图所示:

用time数组记录每个人所需的服务时间,query数组记录要查询的人的编号。元素出队意味着经过了一段时间,下一个元素入队还需要加上经过的这段时间,因此需要用sum数组累加已经经过的时间。 初始化每个队列的时间为0,每入队一个,就累加时间,该元素的服务完成时间res[i]就等于sum[j]加上time[i]。如果某个元素入队前的sum已经超过540分钟,则该元素开始时间晚于17:00,不能被服务。可以用sorry数组来记录每个元素是否能被服务。每个人的服务完成时间另用一个res数组来记录。

注意,测试点1和测试点2运行时错误,是因为没有考虑人数小于n*m的情况。在循环条件中加上人数上限即可。

代码

#include <iostream>
#include <vector>
#include <queue>
#include <climits>
using namespace std;int main(){int n, m, k, q;cin >> n >> m >> k >> q;vector<int> time(k);  // 每个人要花费的时间vector<int> query(q);  // 要查询的人的编号for (int i = 0; i < k; i++){cin >> time[i];}for (int i = 0; i < q; i++){cin >> query[i];}vector<vector<int>> v(m, vector<int>(n));  // 二维数组,包含n个队列,每个队列长为mvector<int> sum(k, 0);  // 计算当前列需要花费的总时间vector<int> res(k, 0);  // 每个人完成的时间vector<bool> sorry(k, false);  // 是否不能被服务int index = 0;  // index为当前人的索引for (int i = 0; i < m && index < k; i++){  // 要加上条件index < k,否则测试点1和测试点2显示运行时错误。考虑人数小于n * m的情况for (int j = 0; j < n && index < k; j++){v[i][j] = time[index];if (sum[j] >= 540){sorry[index] = true;}sum[j] += time[index];res[index] += sum[j];index++;}}for (int i = index; i < k; i++){  // i为当前人的索引int minj = 0;  // 首元素最小的队列的索引int mintime = INT_MAX;for (int j = 0; j < n; j++){if (mintime > v[0][j]){mintime = v[0][j];minj = j;}}res[i] = sum[minj] + time[i];for (int j = 0; j < n; j++){if (j != minj){v[0][j] -= v[0][minj];}}  // 更新其它列的首元素for (int t = 0; t < m - 1; t++){v[t][minj] = v[t + 1][minj];}v[m - 1][minj] = time[i];  // 更新要插入列的首元素if (sum[minj] >= 540){sorry[i] = true;}sum[minj] += time[i];}for (int i = 0; i < q; i++){if (sorry[query[i]-1] == true){cout << "Sorry" << endl;}else{int hour = 8 + res[query[i]-1] / 60;int minute = res[query[i]-1] % 60;printf("%02d:%02d\n", hour, minute);}}return 0;
}
/*
在黄线内的人不需要等待,只有在黄线外的才需要等待并计算最短队列
*/


http://www.ppmy.cn/embedded/156356.html

相关文章

创建一个Spring Boot项目

文章目录 一、如何创建一个Spring Boot项目 1.1 项目创建&#xff1a;专业版 or 社区版 or 网站创建1.2 数据配置1.3 项目启动1.4 代码编写 二、Spring Boot 项目文件介绍三、Web服务器四、根据HTTP状态码解决bug 4.1 4044.2 500 五、Spring VS Spring Boot VS Spring Web MVC…

【大模型】ChatGPT 高效处理图片技巧使用详解

目录 一、前言 二、ChatGPT 4 图片处理介绍 2.1 ChatGPT 4 图片处理概述 2.1.1 图像识别与分类 2.1.2 图像搜索 2.1.3 图像生成 2.1.4 多模态理解 2.1.5 细粒度图像识别 2.1.6 生成式图像任务处理 2.1.7 图像与文本互动 2.2 ChatGPT 4 图片处理应用场景 三、文生图操…

YOLO-cls训练及踩坑记录

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言 一、模型训练 二、测试 三、踩坑记录 1、推理时设置的imgsz不生效 方法一&#xff1a; 方法二&#xff1a; 2、Windows下torchvision版本问题导致报错 总结 前…

JavaScript系列(39)-- Web Workers技术详解

JavaScript Web Workers技术详解 &#x1f504; 今天&#xff0c;让我们深入了解Web Workers技术&#xff0c;这是一种能够在后台线程中运行脚本的强大特性&#xff0c;可以避免阻塞主线程&#xff0c;提升Web应用的性能和响应性。 Web Workers基础概念 &#x1f31f; &#…

网络安全行业岗位职责

系统安全需求分析师 综合能力 掌握常见的IT系统安全需求 具备总结分析整体网络安全需求及子系统安全需求的能力 具有良好的沟通、团队协作和主动性思考的能力 具备良好的技术文档编制能力 专业知识 熟悉网络、终端、数据、威胁情报、态势感知、流量威胁分析等产品的技术方…

MySQL——主从同步

提醒&#xff1a;进行配置时&#xff0c;需要确保一主两从的操作系统、MySQL版本一致&#xff0c;否则将出现问题 环境介绍 服务器IP主服务器172.25.254.10从服务器-1172.25.254.11从服务器-2172.25.254.12 配置 # 快速配置&#xff0c;选择多重执行&#xff0c;确保版本一…

【GORM】初探gorm模型,字段标签与go案例

GORM是什么&#xff1f; GORM 是一个Go 语言 ORM&#xff08;对象关系映射&#xff09;库&#xff0c;它让我们可以使用结构体来操作数据库&#xff0c;而无需编写SQL 语句 GORM 模型与字段标签详解 在 GORM 中&#xff0c;模型是数据库表的抽象表示&#xff0c;字段标签&am…

反向代理模块1

1 概念 1.1 反向代理概念 反向代理是指以代理服务器来接收客户端的请求&#xff0c;然后将请求转发给内部网络上的服务器&#xff0c;将从服务器上得到的结果返回给客户端&#xff0c;此时代理服务器对外表现为一个反向代理服务器。 对于客户端来说&#xff0c;反向代理就相当于…