当前位置: 首页 > news >正文

【PAT甲级题解记录】1014 Waiting in Line (30 分)

【PAT甲级题解记录】1014 Waiting in Line (30 分)

前言

Problem:1014 Waiting in Line (30 分)

Tags:模拟 双端队列

Difficulty:剧情模式 想流点汗 想流点血 死而无憾

Address:1014 Waiting in Line (30 分)

问题描述

银行有N个业务窗口,每个窗口可以排队M人,如果有多的人就在外面等,8点开始K个人按照输入顺序去办理业务,当外面等的人能进去排队时优先选择人少的队伍,如果一样就优先选择序号靠前的窗口。现在给定所有人的业务需要的时间,求每个人按照这个规则办完业务的时间。(只接受17点前开始办理的业务,坑点在于17点前办理的业务结束时间可能超过17点,所以输出时不能只判断结束时间还应考虑开始时间

解题思路

  1. 除了有一个坑点外这道题还是一道并不特别复杂的模拟题,由于是排队自然能想到利用队列去解决,这里可以使用双端队列方便队伍头部的处理。
  2. 思路是按照题目意思先初始化所有队列,包括N个双端队列(窗口排队队列)和一个在外面等的队列;
    • 每次循环都从N个队列的队头中确定出还需办理业务的最短时间,在这一次循环里,等于这个最短时间的所有队头客户都能解决业务,这些客户直接保存好时间后出队;
    • 剩余的队头客户则把各自剩余的办理时间减去前面求出来的最短时间,即更新正在办理业务的客户的剩余时间。
    • 一次循环结束后检查外队列,不为空则按照题目规则入窗口排队队列。
  3. 由于输出时需要知道每一个客户的编号,所以队列元素不仅仅是 “int” ,而应该是一个 “pair<int,int>”。
  4. 输出时需要判断开始时间是否超时,需要我们输入时根据客户编号存放业务时间,每个客户的业务结束时间减去这个时间就是开始时间。

参考代码

/** @Author: Retr0.Wu * @Date: 2022-02-16 15:08:36 * @Last Modified by: Retr0.Wu* @Last Modified time: 2022-02-16 20:35:23*/
#include <bits/stdc++.h>
using namespace std;
int main()
{int N, M, K, Q;cin >> N >> M >> K >> Q;deque<pair<int, int> > deq[21];queue<pair<int, int> > que;vector<int> time(K, 0);vector<int> time_len(K, 0);for (int i = 0; i < K; i++){int ktime;cin >> ktime;time_len[i] = ktime;if (i < N * M){deq[i % N].push_back(make_pair(i, ktime));}else{que.push(make_pair(i, ktime));}}int sumtime = 0;for (int i = 0; i < K; i++) // 至多K次,可能更少{int minn = 0x3f3f3f3f;for (int j = 0; j < N; j++){ // 遍历每一个柜台if (deq[j].empty())continue;int last = deq[j].front().second;minn = min(last, minn);}sumtime += minn; // 别忘了更新已流逝的时间for (int j = 0; j < N; j++){if (deq[j].empty())continue;int last = deq[j].front().second;int id = deq[j].front().first;last -= minn;  // 该客户剩余业务时间if (last == 0) // 该客户业务可以在此次遍历完成{time[id] = sumtime; // 该客户业务完成deq[j].pop_front();if (!que.empty()){deq[j].push_back(que.front());que.pop();}}else // 该客户业务不可以在此次遍历完成{deq[j].pop_front();deq[j].push_front(make_pair(id, last));}}}// for(int i=0;i<K;i++){//     cout<<i+1<<" : "<<time[i]<<endl;// }for (int i = 0; i < Q; i++){int id;cin >> id;if (time[id - 1] - time_len[id - 1] >= 540){cout << "Sorry" << endl;}else{printf("%02d:%02d\n", 8 + time[id - 1] / 60, time[id - 1] % 60);}}return 0;
}

总结

queue deque stack 等基础数据结构需要熟悉,模拟题一般都用的上。

http://www.lryc.cn/news/19324.html

相关文章:

  • web接入大华摄像头实时视频
  • Git代码冲突-不同分支之间的代码冲突
  • KUKA KR C4机器人与S7-1200PLC进行PROFINET通信的具体方法和步骤
  • 从0到1一步一步玩转openEuler--24 openEuler管理进程-调度启动进程
  • Servlet笔记(10):Session跟踪
  • Hive---分区表和分桶表
  • C++ STL
  • java程序员要了解的sql语句优化技巧大全
  • SQL零基础入门学习(十)
  • Pytorch从零开始训练模型【识别数字模型】并测试
  • Leetcode DAY 44: 完全背包 and 零钱兑换 II and 组合总和 Ⅳ
  • 谷歌搜索留痕的技术公式【2023年新版】
  • 2023财年Q4业绩继续下滑,ChatGPT能驱动英伟达重回巅峰吗?
  • 博客管理系统--项目说明
  • 一文带你了解MySQL的Server层和引擎层是如何交互的?
  • CVNLP 常用数据集语料库资源汇总
  • lisp 表达式求值规则
  • Sophos Firewall OS (SFOS) 19.5 MR1 - 同步下一代防火墙
  • 为什么很多人转行IT考虑后端开发Java?
  • WebDAV之π-Disk派盘+Cloud Player
  • Python-datetime、time包常用功能汇总
  • Spring MVC 源码- HandlerAdapter 组件(四)之 HandlerMethodReturnValueHandler
  • 2023面试必备:web自动化测试POM设计模式详解
  • 【人工智能 AI】Robotic Process Automation (RPA) 机器人流程自动化 (RPA)
  • ubuntu/linux系统知识(37)systemd管理临时文件的方法systemd-tmpfiles
  • 云计算专业和计算机专业哪个好就业?
  • electron sha512 checksum mismatch
  • 使用Chemistry Development Kit (CDK) 来进行化学SMILES子结构匹配
  • CMake模块的使用和自定义模块
  • jvm调优参数配置