有n个客户和k个窗口,给出n个客户的到达时间和需要的时长
有空闲的窗口就去办理,没有的话就需要等待,求客户的平均时长。
如果在8点前来的,就需要等到8点。
如果17点以后来的,则不会被服务,无需考虑。

按客户的到达时间排序
建立一个优先级队列,一开始放入k个窗口,初始结束时间为8*3600
然后for循环客户,每次从优先级队列中取出最早结束时间的窗口
如果客户比结束时间来的早,就需要等待
如果客户比结束时间来的晚,就无需等待
最后只要统计那些到达时间在17*3600之前的客户即可。

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <algorithm>
  4. #include <queue>
  5. #include <cstring>
  6. using namespace std;
  7. const int maxn=;
  8. int n,k;
  9. struct Customer{
  10. int arrive; //到达时间
  11. int process; //服务时间
  12. int start; //客户开始被服务的时间
  13. int finish; //客户的结束时间
  14. int wait; //客户的等待时间
  15. bool operator<(const Customer tmp)const{
  16. return arrive<tmp.arrive;
  17. }
  18.  
  19. }cus[maxn];
  20. struct Window{
  21. int finish_time;
  22. bool operator<(const Window tmp)const{
  23. return finish_time>tmp.finish_time;
  24. }
  25. };
  26. int main()
  27. {
  28. int h,m,s,t;
  29. scanf("%d %d",&n,&k);
  30. for(int i=;i<n;i++){
  31. scanf("%d:%d:%d %d",&h,&m,&s,&t);
  32. cus[i].arrive=h*+m*+s;
  33. if(t>)
  34. t=; //样例中其实也没有超过60分钟的数据,题目说了是假设
  35. cus[i].process=t*;
  36. }
  37. priority_queue<Window>q;
  38. Window w;
  39. for(int i=;i<k;i++){
  40. w.finish_time=*;
  41. q.push(w);
  42. }
  43. sort(cus,cus+n);
  44. Window ww;
  45. for(int i=;i<n;i++){
  46. w=q.top();
  47. q.pop();
  48. if(cus[i].arrive<w.finish_time){
  49. cus[i].wait=w.finish_time-cus[i].arrive;
  50. cus[i].start=w.finish_time;
  51. cus[i].finish=cus[i].start+cus[i].process;
  52. ww.finish_time=cus[i].finish;
  53. q.push(ww);
  54. }
  55. else{
  56. cus[i].start=cus[i].arrive;
  57. cus[i].wait=;
  58. cus[i].finish=cus[i].start+cus[i].process;
  59. ww.finish_time=cus[i].finish;
  60. q.push(ww);
  61. }
  62. }
  63. double sum=;
  64. int cnt=;
  65. for(int i=;i<n;i++){
  66. /*
  67. 一开始和P1014搞混了,以为如果是17点之前还没被服务,就不考虑
  68. 后来发现题目中明确说了,是17点之后到的才不考虑
  69. */
  70. if(cus[i].arrive<=*){
  71. sum+=cus[i].wait;
  72. cnt++;
  73. }
  74. }
  75. if(cnt==)
  76. printf("0.0\n"); //去掉这个也能AC,说明样例没有出现cnt为0的情况
  77. else{
  78. double minutes=sum/60.0/cnt;
  79. printf("%.1lf\n",minutes);
  80. }
  81.  
  82. return ;
  83. }

PAT甲题题解-1017. Queueing at Bank (25)-模拟的更多相关文章

  1. PAT甲题题解-1056. Mice and Rice (25)-模拟题

    有n个老鼠,第一行给出n个老鼠的重量,第二行给出他们的顺序.1.每一轮分成若干组,每组m个老鼠,不能整除的多余的作为最后一组.2.每组重量最大的进入下一轮.让你给出每只老鼠最后的排名.很简单,用两个数 ...

  2. PAT甲题题解-1012. The Best Rank (25)-排序水题

    排序,水题因为最后如果一个学生最好的排名有一样的,输出的课程有个优先级A>C>M>E那么按这个优先级顺序进行排序每次排序前先求当前课程的排名然后再与目前最好的排名比较.更新 至于查询 ...

  3. PAT甲题题解-1036. Boys vs Girls (25)-找最大最小,大水题

    题意:给出n个人的姓名.性别.ID.分数,让你找出其中哪个妹纸分数最高.哪个汉子分数最低.以及他们的差如果没有妹纸或者汉子,则对应输出Absent,差用NA代替. 就是for一遍找最大最小值,水题 # ...

  4. PAT甲题题解-1062. Talent and Virtue (25)-排序水题

    水题,分组排序即可. #include <iostream> #include <cstdio> #include <algorithm> #include < ...

  5. PAT甲题题解-1074. Reversing Linked List (25)-求反向链表

    题意说的很清楚了,这种题的话,做的时候最好就是在纸上自己亲手模拟一下,清楚一下各个指针的情况, 这样写的时候就很清楚各个指针变量保存的是什么值. PS:一次AC哈哈,所以说自己动手在纸上画画还是很有好 ...

  6. PAT甲题题解-1125. Chain the Ropes (25)-贪心水题

    贪心水题,每次取最短的两个绳子合并,长度缩减成一半 #include <iostream> #include <cstdio> #include <algorithm&g ...

  7. PAT甲题题解-1007. Maximum Subsequence Sum (25)-求最大子区间和

    题意:给出n个数,求最大连续的子区间和,并且输出该区间的第一个和最后一个数. 如果所有数都小于0,那么则输出0,第一个数和最后一个数. 看数据k的范围,就知道肯定不能两层for循环来求区间和,O(n^ ...

  8. PAT甲题题解-1009. Product of Polynomials (25)-多项式相乘

    多项式相乘 注意相乘结果的多项式要开两倍的大小!!! #include <iostream> #include <cstdio> #include <algorithm& ...

  9. PAT甲题题解-1013. Battle Over Cities (25)-求联通分支个数

    题目就是求联通分支个数删除一个点,剩下联通分支个数为cnt,那么需要建立cnt-1边才能把这cnt个联通分支个数求出来怎么求联通分支个数呢可以用并查集,但并查集的话复杂度是O(m*logn*k)我这里 ...

随机推荐

  1. pig:group by之后的其它统计方法一

    --测试Top N后的其它统计 A = LOAD '/TraceParser/blackcore/' USING PigStorage() as (lk_id:chararray,host:chara ...

  2. include_path='.;C:\php5\pear'解决方法

    问题原因:路径中出现中文, 解决方法:你懂的,,

  3. 技术分享之AQS——内容提要

    1. 背景 最近团队内部技术分享,我做了个关于AQS的分享.ppt中涵盖的部分要点内容,现在整理到博客上. 关于AQS本身的源码解读,可以参考我之前的博文. 2. 要点梳理 下面是一些技术分享的要点梳 ...

  4. Redis系列五:redis键管理和redis数据库管理

    一.redis键管理 1 键重命名 rename oldKey newkey //格式rename oldKey newKey //若oldKey之前存在则被覆盖set name james :set ...

  5. 【转】在嵌入式Linux和PC机Linux下使用popen函数时,程序运行结果有差异。

    下面程序演示了在嵌入式Linux和PC机Linux下使用popen函数时,程序的运行结果是有差异的. 两个程序 atest.c 和 btest.c,atest 检查是否有 btest 进程运行,如果没 ...

  6. Python2.7-argparse

    argparse模块,用于方便地编写用户友好的命令行接口,可以自动生成帮助信息,用法信息和错误处理 1.模块对象 1.1 ArgumentParser 对象 1.1.1 初始化构建类:Argument ...

  7. Kafka设计解析(十九)Kafka consumer group位移重设

    转载自 huxihx,原文链接 Kafka consumer group位移重设 本文阐述如何使用Kafka自带的kafka-consumer-groups.sh脚本随意设置消费者组(consumer ...

  8. 蓝桥杯之 2n皇后问题(双层dfs,暴力)

    Description 给定一个n*n的棋盘,棋盘中有一些位置不能放皇后.现在要向棋盘中放入n个黑皇后 和n个白皇后,使任意的两个黑皇后都不在同一行.同一列或同一条对角线上,任意的两 个白皇后都不在同 ...

  9. Linux常用系统信息查看命令

    [转]http://yulans.cn/linux/linux%E5%B8%B8%E7%94%A8%E7%B3%BB%E7%BB%9F%E4%BF%A1%E6%81%AF%E6%9F%A5%E7%9C ...

  10. WWDC 2015 苹果发布会 笔记

    北京时间2015年6月9日凌晨一点,美国旧金山,WWDC 2015苹果发布会,早前知道ios9会更注重系统的优化,看来果真如此,不过最让我惊讶的是Swift居然宣布开源,当时我就震惊了,不过Swift ...