文章目录

  • 一、答案
    • (一)推荐答案
    • (二)个人解答
  • 二、坑点
  • 三、相关知识
    • (一)vector 与queue 两种结构的使用方法
    • (二)其他

一、答案

(一)推荐答案

链接:PAT甲级1014 测试点4、5

(二)个人解答

#include <iostream>
#include<bits/stdc++.h>
using namespace std;struct man    //个人结构体
{int id;int serve_time=0;int end_time=0;
};int main()
{int window_num,window_size,customer_num,query_num;cin>>window_num>>window_size>>customer_num>>query_num;vector<man> customer(customer_num);       //客户向量,存放客户数据vector<queue<man>> line(window_num);      //窗口队列向量,每一个队列对应一个窗口queue<man> wait;                          //等待队列for(int i=0;i<customer_num;i++){          //读取各顾客等待时间customer[i].id=i;cin>>customer[i].serve_time;}//前“窗口大小*窗口数量”位的顾客直接进入窗口排队,其余进入等待队列for(int i=0;i<customer_num;i++){if(i<window_num*window_size){if(i<window_num){customer[i].end_time=customer[i].serve_time;}line[i%window_num].push(customer[i]);}else{wait.push(customer[i]);}}//伴随各窗口队列顾客离队,为等待队列中的顾客安排窗口,直到没法安排(各窗口第一位顾客完成时间都晚于17:00)int return_tag=0;while(return_tag==0 && !wait.empty()){int fastest_time=540;int fastest_win=-1;//选择首位顾客最早完成的窗口for(int i=0;i<window_num;i++){if(line[i].front().end_time<fastest_time){fastest_time=line[i].front().end_time;fastest_win=i;}}if(fastest_time==540){           //各窗口第一位顾客完成时间都晚于17:00,没法安排窗口return_tag=1;}else{                           //安排窗口line[fastest_win].pop();     //窗口队列首位顾客离队line[fastest_win].front().end_time=fastest_time+line[fastest_win].front().serve_time;//更新队头顾客完成时间customer[line[fastest_win].front().id].end_time=line[fastest_win].front().end_time;//同步更新line[fastest_win].push(wait.front());//等待队列顾客入队wait.pop();                          //已进入窗口,从等待队列离队}}//窗口剩余顾客离队for(int i=0;i<window_num;i++){while(!line[i].empty()){if(line[i].front().end_time<540){         //当完成时间早于17:00时,一直安排离队int save_time=line[i].front().end_time;line[i].pop();if(!line[i].empty()){line[i].front().end_time=save_time+line[i].front().serve_time;customer[line[i].front().id].end_time=line[i].front().end_time;}}else{break;}}}//读取需查询的顾客,输出结果for(int i=0;i<query_num;i++){int query_cus;cin>>query_cus;query_cus=query_cus-1;int finish_time=customer[query_cus].end_time;if(finish_time!=0){int h=finish_time/60+8;int m=finish_time%60;printf("%02d:%02d\n",h,m);}else{cout<<"Sorry"<<endl;}}return 0;
}

二、坑点

1. 所有业务开始时间早于17:00的顾客都能被服务,哪怕花费9999分钟
2. 优先选择窗口首位顾客最快完成的队伍,哪怕其他队伍总耗时短

三、相关知识

(一)vector 与queue 两种结构的使用方法

      这题可以使用简单的整形数组 int [ ] 或 链表与结构体 来完成,但都会比较复杂,使用vector 与queue会是更优解。以下附上两篇链接,可以了解vector 与queue基本使用方法。

1. C++ vector的用法(整理)

2. C++ queue队列 (详细)

(二)其他

      同时在写本题过程中还遇到另一个问题:queue中将一个元素入队时是创建了一个新的副本,当队列中的元素修改时,并不会对原元素进行修改,需要自行同步修改。
      => C++ STL的queue中push操作产生副本的问题

      最后,萌新写文,如有不足,还望指正

PAT甲级 1014 刷题记录相关推荐

  1. PAT甲级刷题记录-(AcWing)-(Day06树 8题)

    PAT甲级刷题记录-(AcWing)-(Day06树 8题) 课程来源AcWing 其中AcWing中的题目为翻译好的中文题目 今日刷题列表 1110 Complete Binary Tree 111 ...

  2. 小峰峰的pat甲级刷题记录1020

    小峰峰的pat甲级刷题记录1020 方法一:通过后序和中序序列构建树,再层序输出 #include<iostream> #include<vector> using names ...

  3. Python刷题记录(81-90)

    Python刷题记录(81-90) 题目来源PTA平台 PAT (Basic Level) Practice (中文) @TOC 1081 检查密码 本题要求你帮助某网站的用户注册模块写一个密码合法性 ...

  4. 算法笔记CodeUp第一至第六章刷题记录

    文章目录 <算法笔记>2.2小节--C/C++快速入门->顺序结构 1.例题1-1-1 按要求输出信息(1) 2.例题1-1-2 按要求输出信息(2) 3.例题1-2-1 求两个整数 ...

  5. 重走长征路---OI每周刷题记录---9月21日 2013 AC 17题

    总目录详见https://blog.csdn.net/mrcrack/article/details/84471041 做题原则,找不到测评地址的题不做.2018-11-28 重走长征路---OI每周 ...

  6. LeetCode刷题记录15——21. Merge Two Sorted Lists(easy)

    LeetCode刷题记录15--21. Merge Two Sorted Lists(easy) 目录 LeetCode刷题记录15--21. Merge Two Sorted Lists(easy) ...

  7. LeetCode刷题记录14——257. Binary Tree Paths(easy)

    LeetCode刷题记录14--257. Binary Tree Paths(easy) 目录 前言 题目 语言 思路 源码 后记 前言 数据结构感觉理论简单,实践起来很困难. 题目 给定一个二叉树, ...

  8. LeetCode刷题记录13——705. Design HashSet(easy)

    LeetCode刷题记录13--705. Design HashSet(easy) 目录 LeetCode刷题记录13--705. Design HashSet(easy) 前言 题目 语言 思路 源 ...

  9. LeetCode刷题记录12——232. Implement Queue using Stacks(easy)

    LeetCode刷题记录12--232. Implement Queue using Stacks(easy) 目录 LeetCode刷题记录12--232. Implement Queue usin ...

最新文章

  1. 深入理解TCP/IP协议族
  2. 基于能量或过零率的实时语音分割--学习笔记
  3. MySQL的my.cnf文件(解决5.7.18下没有my-default.cnf)
  4. Java NIO系列教程(十 五)Java NIO Path
  5. 如何查询oracle最近报警信息,教你怎样用Oracle方便地查看报警日志错误
  6. springboot转发http请求_网易后端实习生分享:Springboot异常和错误处理规范
  7. mysql 内部安全性_MySQL数据库的内部以及外部安全性简介
  8. 深度学习行人重识别综述与展望
  9. R-CNN家族梳理:从R-CNN到Mask R-CNN
  10. idea 搭建 tensorflow 的 java 开发环境
  11. 终于解决华硕电脑触摸板的关闭问题
  12. vue 页面保存为本地图片
  13. 2020年阴历二月二十六 投资理财~读万科财报有感
  14. 怎么将excel转换pdf在线转换
  15. 【笔记】2022.06.20 python数据分析三大神器numpy、pandas、matplotlib
  16. 随笔记:利用Apache设置反向代理
  17. ikbc c104win键盘失灵以及数字键失灵
  18. UG基础知识学习视频目录整理(建模篇)
  19. 建立KMS服务器,激活WIN、office
  20. 星瞳科技 OpenMV 的使用

热门文章

  1. matlab 之 diag 函数用法
  2. Ninja - chromium核心构建工具
  3. MappedByteBuffer释放内存
  4. Unity调用摄像头并截图
  5. java语言程序设计第三版答案郎波著,都是精髓!
  6. android仿微信头像点击放大查看,仿微信查看图片(带大小图切换查看)
  7. 台电 x80 pro 双系统 刷win10最新家庭版
  8. 简单的Java打字游戏
  9. 小心这些没有硝烟的鸦片软件
  10. 仿真软件OriginPro之《文献图片取点方法》