解题思路:  


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();//每组数据测试完队列清空 
    } 
}


点赞(1)
 

0.0分

1 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论