原题链接:数据结构-银行排队
解题思路:
1. 使用优先队列来优化选择窗口的操作,优先队列(小顶堆)的特性可以保证每次堆顶元素就是当前空闲时间最早(即空闲时间最短)的窗口
2.客户到达后只需要与当前堆顶元素进行比较,如果小于等于说明提前到达(堆顶-到达时间)计算等待时间 然后将堆顶加上用户处理时间后重新入堆,反之如果大于说明当前窗口空闲可以直接入堆。
注意事项:
1.、每次有客户到来,相应窗口的队尾记得要更新。
2.多组测试数据,在每组测试数据结束后要记得将队列和平均等待时间要清0。
3.题目中的平均等待时间 = 总等待时间 / 总人数。
参考代码:
#include<cstdio> #include<queue> using namespace std; priority_queue<int,vector<int>,greater<int>>dq;//模拟银行窗口 采用小顶堆 double q=0;//等待时间 void mio(int marr,int stay){ int yi=dq.top();//选择最优窗口,空闲时间最长对应窗口队尾的人离开时刻最早 dq.pop();//是小顶堆所以取堆顶并出队 if(marr<=yi){ // 到达时间早于上一个人结束时间 q+=yi-marr; //记录等待时间总和 yi+=stay; //更新队尾数据 dq.push(yi); } else //不用等待的情况,即没有队尾(队尾的人已经离开) dq.push(marr+stay);//更新队尾数据 } int main(){ int n,m,stay,marr; while(scanf("%d",&n)!=EOF){ for(int j=0;j<n;j++){ dq.push(0); } //给队列初始话,有几个窗口就初始化几个0 scanf("%d",&m); for(int i=0;i<m;i++){ scanf("%d",&marr); scanf("%d",&stay); mio(marr,stay); } q=q/m;//平均等待时间 printf("%.2lf\n",q); q=0;//每组数据测试完,平均等待时间清0 for(int l=0;l<dq.size();l++) dq.pop();//每组数据测试完队列清空 } }
0.0分
1 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复