• 1014 Waiting in Line(30)& 1017 Queueing at Bank(25)


    目录

    🧡1014 Waiting in Line

    解析

    易错点

    代码

    🧡1017 Queueing at Bank

    解析

    易错点

    代码


    💟这里是CS大白话专场,让枯燥的学习变得有趣!

    💟没有对象不要怕,我们new一个出来,每天对ta说不尽情话!

    💟好记性不如烂键盘,自己总结不如收藏别人!

    💌1014和1017这两个排队题真的搞死我了[○・`Д´・ ○],记录一些踩坑点!

    🧡1014 Waiting in Line

    题目链接:PTA | 程序设计类实验辅助教学平台

    解析

    💌银行有N个窗口,每个窗口在黄线内可排M个人,如果黄线内没有排满就入队(按窗口顺序入队),排满的话就在黄线外等待,黄线内出一个进一个,如果同时出了多个,选窗口小的进。营业时间8:00-17:00,如果客户在17:00及之后还没被服务,就不再服务,如果已经开始服务了,就要完成服务。

    🍠输入

    第一行:窗口数N,黄线内每个窗口最大容量M,客户数K,问询结束时间的客户数Q。

    第二行:K个客户的处理时间(min)。

    第三行:问询的客户编号。

    易错点

    🍠黄线外选取最小的出列窗口。

    🍠查询的时候编号要减一,因为存储的时候索引是从0开始的~

    代码

    1. #include
    2. #include
    3. #include
    4. using namespace std;
    5. struct Customer{
    6. int startTime,processTime,endTime;
    7. }customer[1000];
    8. int main(){
    9. int N,M,K,Q; //N:窗口 M:一队长度 K:总人数 Q:需要告知时间的人
    10. cin >> N >> M >> K >> Q;
    11. for(int i=0;i> customer[i].processTime;
    12. queue windows[N];
    13. int openTime = 8*60, closeTime = 17*60;
    14. // 入队
    15. for(int i=0;i
    16. // 排黄线内
    17. if(i
    18. int window = i%N;
    19. if(i
    20. customer[i].startTime = openTime;
    21. customer[i].endTime = openTime + customer[i].processTime;
    22. }else{
    23. customer[i].startTime = windows[window].back().endTime;
    24. customer[i].endTime = customer[i].startTime + customer[i].processTime;
    25. }
    26. windows[window].push(customer[i]);
    27. }
    28. // 排黄线外
    29. else{
    30. int window = 0;
    31. for(int j=1;j
    32. if(windows[j].front().endTimefront().endTime){
    33. window = j;
    34. }
    35. }
    36. windows[window].pop();
    37. customer[i].startTime = windows[window].back().endTime;
    38. customer[i].endTime = customer[i].startTime + customer[i].processTime;
    39. windows[window].push(customer[i]);
    40. }
    41. }
    42. int id;
    43. while(Q--){
    44. cin >> id;
    45. if(customer[id-1].startTime < closeTime){
    46. printf("%02d:%02d\n",customer[id-1].endTime/60,customer[id-1].endTime%60);
    47. }
    48. else{
    49. cout << "Sorry" << endl;;
    50. }
    51. }
    52. return 0;
    53. }

    🧡1017 Queueing at Bank

    题目链接:PTA | 程序设计类实验辅助教学平台

    解析

    💌银行有N个客户,K个窗口,客户来了排成一队,选择空闲窗口服务,没有则继续排队等待,求,求平均等待时长。营业时间8:00-17:00,如果客户8:00之前到,要等到8:00开始服务,如果客户在17:00之后到,就不再为其服务,如果已经到了,加班加点也要完成服务(没见过这么敬业的银行(キ`゚Д゚´)!!)。可以不用队列来做,直接用数组lastTime记录当前每个窗口结束时间即可。

    易错点

    🍠平均是对有效服务客户的平均,没有被服务的客户不算在内。最好一开始读数据的时候就把不符合的客户剔除,不然后面测试点4一直不通过。。

    🍠等待时间的计算要用到达时间和窗口结束时间比较,如果在结束之前到则需要计算,如果在结束之后到则不用等待。

    🍠选择当前最快结束或空闲的服务窗口排队,如果需要等待,则该客户结束时间从窗口结束服务时间算起,如果不用等待,则从到达时间算起。

    🍠如果没有有效服务,输出0.0。

    代码

    1. #include
    2. #include
    3. #include
    4. using namespace std;
    5. struct Customer{
    6. int time,pro;
    7. int wait = 0;
    8. }cus[10002];
    9. bool cmp(Customer cus1, Customer cus2){
    10. return cus1.time < cus2.time;
    11. }
    12. int main(){
    13. int openTime = 8*60*60, closeTime = 17*60*60;
    14. int N,K; //N:总人数 K:窗口
    15. int success = 0; //记录有效人数
    16. cin >> N >> K;
    17. for(int i=0;i
    18. int hour,min,sec,pro;
    19. scanf("%d:%d:%d %d",&hour,&min,&sec,&pro);
    20. int time = hour*60*60+min*60+sec;
    21. if(time>=closeTime || pro>3600) continue;
    22. cus[success].time = time;
    23. cus[success].pro = pro*60;
    24. success++;
    25. }
    26. sort(cus,cus+success,cmp);
    27. int lastTime[K]; //记录每个窗口当前队伍结束时间
    28. //初始化
    29. for(int i=0;i
    30. lastTime[i] = openTime;
    31. }
    32. for(int i=0;i
    33. //前K个人
    34. if(i
    35. cus[i].wait = max(openTime-cus[i].time,0);
    36. lastTime[i] = max(openTime,cus[i].time)+cus[i].pro;
    37. }
    38. else{
    39. int shortTime = lastTime[0];
    40. int window = 0;
    41. for(int j=1;j
    42. //找当前最短的队伍
    43. if(lastTime[j]
    44. shortTime = lastTime[j];
    45. window = j;
    46. }
    47. }
    48. //排到最短的队伍后面
    49. cus[i].wait = max(lastTime[window]-cus[i].time,0);
    50. //如果等待则从上个人结束时间算起,如果没等则从到达时间算起
    51. lastTime[window] = max(lastTime[window],cus[i].time)+cus[i].pro;
    52. }
    53. }
    54. if(success){
    55. float totalTime = 0;
    56. for(int i=0;i
    57. totalTime += cus[i].wait;
    58. }
    59. float ave = (totalTime/60)/success;
    60. printf("%.1f\n",ave);
    61. }
    62. else printf("%.1f\n",0);
    63. return 0;
    64. }

      

  • 相关阅读:
    c++ 结构体
    CentOS常见命令详解
    科研素养:了解学术会议的形式和结构
    L3 Hive操作
    【20220902】5 tips to improve your critical thinking
    第12章Linux实操篇-网络配置
    计算机毕业设计ssm高校教师科研能力评定系统40n60系统+程序+源码+lw+远程部署
    Python3初步实践教程概要
    【JavaEE 学习笔记】JavaScript(WebAPI)附代码案例,猜数字网页版(完整版源码)
    VertiGIS进入下一增长阶段,任命Andy Berry为首席执行官
  • 原文地址:https://blog.csdn.net/qq_41847894/article/details/127674454