1014 Waiting in Line

链接:

1014 Waiting in Line - PAT (Advanced Level) Practice (pintia.cn) 

大致题意:

  • n 个窗口,每个窗口最多能容纳 m 人同时排队。
  • 一共有 k 个顾客,他们每个人有一个服务时长 t[i]
  • 顾客们从早上 8 点开始服务。
  • 如果一个顾客在下午 5 点(即 17:00)还没有开始服务,那么他不会被服务(输出 "Sorry"),否则就会服务到完成。

如果一个客户在17:00以及以后还没有开始服务就不再服务输出sorry;如果这个服务已经开始了,无论时间多长都要等他服务完毕。

基本思路:

代码的主要流程:

小时:分钟不好比较,可以先转为分钟,最后根据格式化来输出即可。

  1. 模拟顾客排队的过程

    • 使用一个 deque<int> deq[22] 数组来模拟每个窗口的队列,最多 22 个窗口(n 不会超过 22)。
    • 对于每个顾客,根据以下规则安排排队:
      1. 首先找到队伍人数最少的窗口 p
      2. 如果当前选择的窗口队伍已经满了(队列长度达到 m),需要找到队列最早有空位的窗口,将该窗口的最早服务结束的顾客移出队列。
      3. 将当前顾客加入所选的窗口,并根据窗口最后一个顾客的结束时间来计算他的开始时间和结束时间。
  2. 顾客入队逻辑

    • 每当一个顾客加入队列时,如果队列不为空,那么他的服务开始时间是队列中最后一个顾客的服务结束时间之后,计算该顾客的服务结束时间。
  3. 查询处理

    • 查询部分根据输入的顾客编号 x,判断该顾客的服务是否在 17:00 之前开始。如果没有在 17:00 之前开始服务,输出 "Sorry",否则输出该顾客服务结束的具体时间。
#include<bits/stdc++.h>
using namespace std;int finish[1010], start[1010], t[1010];
deque<int> dq[22];  // 每个窗口的队列
int Long = 9 * 60;  // 表示17:00 (540分钟)int main() {int n, m, k, q; cin >> n >> m >> k >> q;for (int i = 1; i <= k; i++) {cin >> t[i];  // 输入每个顾客的服务时间// 为顾客选择人数最少的窗口int p = 1;for (int j = 2; j <= n; j++) {if (dq[j].size() < dq[p].size()) p = j;  // 找到队伍人数最少的窗口}// 如果队伍已满,选择服务最早结束的窗口if (dq[p].size() == m) {for (int j = 1; j <= n; j++) {if (!dq[j].empty()) {  // 确保队列不为空int Inidx = dq[j].front();if (finish[Inidx] < finish[dq[p].front()]) {  // 找到最早结束的顾客p = j;}}}dq[p].pop_front();  // 服务结束的顾客出队}// 计算当前顾客的服务开始时间和结束时间int last = 0;if (!dq[p].empty()) last = dq[p].back();  // 获取队列最后一个顾客start[i] = finish[last];  // 当前顾客的开始时间是最后一个顾客的结束时间finish[i] = start[i] + t[i];  // 当前顾客的结束时间dq[p].push_back(i);  // 将当前顾客加入队列}while (q--) {int x;cin >> x; if (start[x] >= Long) {cout << "Sorry\n";  // 如果开始时间在17:00之后,输出Sorry} else {printf("%02d:%02d\n", 8 + finish[x] / 60, finish[x] % 60);}}return 0;
}

疑问?

为什么可以使用双端队列?

因为在我们计算顾客的开始时间和结束时间的时候,需要根据当前窗口最后一个顾客的结束时间作为开始时间,我们需要频繁的获取队列中最后一个顾客,所以使用双端队列不失为一个好方法。

输出的格式表示什么意思?

printf("%02d:%02d\n", ...) 的作用是将小时和分钟格式化为 hh:mm 的形式,如果小时或分钟不足两位,则前面补零。

%02d:这是 printf 函数中的格式控制符,用于以两位数字输出,如果数字只有一位,则在前面补零。例如,输出 08:05 而不是 8:5

服务时间是基于早上 8 点开始的,因此小时部分需要加上 8

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1527453.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

【Python 千题 —— 算法篇】无重复字符最长子段

Python 千题持续更新中 …… 脑图地址 &#x1f449;&#xff1a;⭐https://twilight-fanyi.gitee.io/mind-map/Python千题.html⭐ 题目背景 在编程过程中&#xff0c;处理字符串的任务时常遇到&#xff0c;其中一个经典问题是查找无重复字符的最长子串。这在很多应用场景中…

KRTSt内嵌Lua脚本

KRTSt内嵌Lua脚本 Lua 简介 Lua是一门强大、高效、轻量、可嵌入的脚本语言。它支持多种编程架构&#xff1a;过程编程、面向对象编程&#xff08;OOP&#xff09;、函数式编程、数据驱动编程及数据描述。 Lua结合了简洁的过程语法和强大的数据描述结构&#xff08;基于关联数…

《Web性能权威指南》-网络技术概览-读书笔记

注&#xff1a;TCP/IP等知识牵涉面太广&#xff0c;且不说本文&#xff0c;哪怕是原书&#xff0c;限于篇幅&#xff0c;很多知识点都是大致介绍下。如果想深入理解&#xff0c;需要更一步Google相关页面资料。 延迟与带宽 WPO&#xff0c;Web Performance Optimization&…

算法day09 二叉树

class Node<V>{V value;Node left;Node right; } 一、用递归和非递归分别实现二叉树的前序&#xff0c;中序&#xff0c;后序遍历 非递归方式&#xff1a; 前序遍历 根左右 0&#xff09;利用stack后进先出的特点 要输出根左右的顺序&#xff0c;将元素右边先放入栈中…

【CanMV K230】圆形检测

【CanMV K230】圆形检测 什么是圆形检测圆形检测应用领域1.工业自动化2.机器人视觉3.医学图像分析4.目标识别5.质量检测6.研究和开发 K230应用相关函数官方例程HDMI屏幕使用圆形检测 本篇内容&#xff1a; 什么是圆形检测圆形检测应用领域K230应用&#xff08;包含相应函数及例…

SAP学习笔记 - 开发03 - CDSView开发环境搭建,Eclipse中连接SAP,CDSView创建

上一章讲了BTP的账号创建&#xff0c;环境搭建等内容。 SAP学习笔记 - 开发02 - BTP实操流程&#xff08;账号注册&#xff0c;BTP控制台&#xff0c;BTP集成开发环境搭建&#xff09;-CSDN博客 本章继续讲SAP开发。 - CDSView 的开发环境&#xff08;Eclipse&#xff09;搭建…

C++初阶:STL详解(一)——string类

✨✨小新课堂开课了&#xff0c;欢迎欢迎~✨✨ &#x1f388;&#x1f388;养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; 所属专栏&#xff1a;C&#xff1a;由浅入深篇 小新的主页&#xff1a;编程版小新-CSDN博客 1.为什么会有string类 C 语言中&#xff0c…

驾驭不断发展的人工智能世界

从很多方面来看&#xff0c;历史似乎正在重演。许多企业正争相采用生成式人工智能 (Gen AI)&#xff0c;就像它们争相采用云计算一样&#xff0c;原因也是一样的&#xff1a;效率、成本节约和竞争优势。 然而&#xff0c;与云一样&#xff0c;GenAI 仍是一项发展中的技术&…

Kafka 分布式消息系统详细介绍

Kafka 分布式消息系统 一、Kafka 概述1.1 Kafka 定义1.2 Kafka 设计目标1.3 Kafka 特点 二、Kafka 架构设计2.1 基本架构2.2 Topic 和 Partition2.3 消费者和消费者组2.4 Replica 副本 三、Kafka 分布式集群搭建3.1 下载解压3.1.1 上传解压 3.2 修改 Kafka 配置文件3.2.1 修改z…

网络原理之TCP协议(万字详解!!!)

目录 前言 TCP协议段格式 TCP协议相关特性 1.确认应答 2.超时重传 3.连接管理&#xff08;三次握手、四次挥手&#xff09; 三次握手&#xff08;建立TCP连接&#xff09; 四次挥手&#xff08;断开连接&#xff09; 4.滑动窗口 5.流量控制 6.拥塞控制 7.延迟应答…

gazebo 已加载模型但无法显示

目录 写在前面的话问题一&#xff1a;robot_state_publisher 发布机器人信息失败报错一 Error: Error document empty.报错二 .xcaro 文件中有多行注释成功启动 问题二&#xff1a;通过 ros2 启动 gazebo 失败成功启动 问题三&#xff1a;gazebo 崩溃和无法显示模型问题四&…

【Kubernetes】K8s 的安全框架和用户认证

K8s 的安全框架和用户认证 1.Kubernetes 的安全框架1.1 认证&#xff1a;Authentication1.2 鉴权&#xff1a;Authorization1.3 准入控制&#xff1a;Admission Control 2.Kubernetes 的用户认证2.1 Kubernetes 的用户认证方式2.2 配置 Kubernetes 集群使用密码认证 Kubernetes…

Pr:首选项 - 音频

Pr菜单&#xff1a;编辑/首选项 Edit/Preferences Premiere Pro 首选项中的“音频” Audio选项卡主要作用是控制音频的处理设置&#xff0c;包括音量调整、波形生成、音频渲染等选项&#xff0c;这些设置有助于优化音频的处理和编辑工作&#xff0c;适用于不同的剪辑需求和项目…

VS Code 调试go程序的相关配置说明

用 VS code 调试Go程序需要在.vscode/launch.json文件中增加如下配置&#xff1a; // launch.json {// Use IntelliSense to learn about possible attributes.// Hover to view descriptions of existing attributes.// For more information, visit: https://go.microsoft.…

RISC-V (十二)系统调用

系统模式&#xff1a;用户态和内核态 当前的代码都是实现在machine模式下。 系统模式的切换 epc寄存器的值存放的是ecall指本身的地址 。 用ecall指令 系统调用的执行流程 mret这条指令会利用status的mpp值恢复到之前的特权级别。 蓝色的线表示涉及到权限切换。 系统调用的传…

想要从OPPO手机恢复数据?免费OPPO照片视频恢复软件

此实用程序可帮助那些寻找以下内容的用户&#xff1a; 在OPPO手机中格式化存储卡后可以恢复图片吗&#xff1f;我删除了 OPPO上的视频和图片&#xff0c;我感觉很糟糕&#xff0c;因为里面有我在拉斯维加斯拍摄的视频和照片 免费OPPO照片视频恢复软件 您能恢复OPPO上已删除的…

JavaScript拷贝的艺术:玩转深拷贝和浅拷贝

前言 在实际的项目开发中&#xff0c;我们时刻都在使用数据拷贝功能&#xff0c;赋值、深拷贝和浅拷贝是前端开发中常见的概念&#xff0c;用于复制简单数据类型&#xff08;字符串、数值、布尔值&#xff09;和引用类型&#xff08;对象、数组&#xff09;。它们的主要区别在…

spring中添加@Test注解测试

1、添加maven依赖 <!-- 添加test方便测试--><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.13.2</version><scope>test</scope></dependency><dependency><grou…

C语言进阶版第8课—指针(2)

文章目录 1. 数组名的理解2. 指针访问数组3. 一维数组传参本质4. 冒泡排序5. 二级指针6. 指针数组7. 指针数组模拟二维数组 1. 数组名的理解 sizeof&#xff08;数组名&#xff09;— 这里的数组名代表整个数组&#xff0c;计算的也是整个数组的大小&数组名 — 这里的数组名…

HTML 基础,尚优选网站设计开发(二)

最近在恶补HTML相关知识点&#xff0c;本人是后端程序员&#xff0c;看到周围很多人都被裁员了&#xff0c;突然想尽早转变成全栈程序员变成独立开发者&#xff0c;有空余接接私单、商单的 尚优选网站设计开发&#xff0c;HTMLCSSJavaScript实际使用 尚优选网站设计开发页面分析…