pat1017Queueing at Bank (25)
2015-10-03 15:54
375 查看
题意分析:
(1)给出N个人的到达银行的时间和需要被服务的时间,在K个窗口的情况下,求出所有人的平均等待时间,对于5点以后到达的人不计算在内。
(2)看似是排队的问题,需要先固定每个人在哪个窗口队列的哪个位置以及他前面的人的服务时间,同时也依赖于他的到达时间和当前第一个人被服务了多长时间,这样看来问题变得复杂了许多,我们将问题简化成这样:每个窗口只维护自己的空闲时刻(8:00开始),谁最先空闲了,就选择等待队列中最早到达银行的开始服务,这样这个人的等待时间就等于此窗口的空闲时刻-客户到达时刻,注意:若此值为正,说明这个窗口在服务上一个人期间,这个人就到达了,他需要等待,若小于等于0,说明此人在这个窗口空闲时刻之前都还没有到达银行,那么可想而知,一旦他到达银行,他不需要等待,直接获取服务,服务结束后,更新此窗口的空闲时刻。依次类推,直到队列为空或者只剩下17:00以后到达的人。
(3)为了计算的方便,我们将所有的时刻全部算成秒,如:8:00就是8*3600秒
(4)每次都要计算最先空闲的窗口,因此必然涉及到排序。
(5)在服务结束后,更新窗口的空闲时刻需要注意:若客户到达的时候,窗口不空闲,那么意味着这个窗口服务完上一个人后立即服务这个人,因此这个窗口的下一次空闲时刻是本次空闲时刻+此人的服务时间,反之,若在空闲时刻时候到达的,那么窗口一直要等到他到达银行,再给他服务,因此下一次的空闲时刻=此人到达时间+服务时间
可能坑点:
(1)不要忽略等待人数为0的情况;
(2)统计的时候需要过滤掉在17:00之后到达的人
(1)给出N个人的到达银行的时间和需要被服务的时间,在K个窗口的情况下,求出所有人的平均等待时间,对于5点以后到达的人不计算在内。
(2)看似是排队的问题,需要先固定每个人在哪个窗口队列的哪个位置以及他前面的人的服务时间,同时也依赖于他的到达时间和当前第一个人被服务了多长时间,这样看来问题变得复杂了许多,我们将问题简化成这样:每个窗口只维护自己的空闲时刻(8:00开始),谁最先空闲了,就选择等待队列中最早到达银行的开始服务,这样这个人的等待时间就等于此窗口的空闲时刻-客户到达时刻,注意:若此值为正,说明这个窗口在服务上一个人期间,这个人就到达了,他需要等待,若小于等于0,说明此人在这个窗口空闲时刻之前都还没有到达银行,那么可想而知,一旦他到达银行,他不需要等待,直接获取服务,服务结束后,更新此窗口的空闲时刻。依次类推,直到队列为空或者只剩下17:00以后到达的人。
(3)为了计算的方便,我们将所有的时刻全部算成秒,如:8:00就是8*3600秒
(4)每次都要计算最先空闲的窗口,因此必然涉及到排序。
(5)在服务结束后,更新窗口的空闲时刻需要注意:若客户到达的时候,窗口不空闲,那么意味着这个窗口服务完上一个人后立即服务这个人,因此这个窗口的下一次空闲时刻是本次空闲时刻+此人的服务时间,反之,若在空闲时刻时候到达的,那么窗口一直要等到他到达银行,再给他服务,因此下一次的空闲时刻=此人到达时间+服务时间
可能坑点:
(1)不要忽略等待人数为0的情况;
(2)统计的时候需要过滤掉在17:00之后到达的人
#include <iostream> #include <algorithm> #include <stdio.h> #include <string.h> using namespace std; int window[101]; struct cus { int arrayTime; int serveTime; }; cus Cus[10001]; bool cmp2(int a,int b) { return a<b; } bool cmp1(cus a,cus b) { return a.arrayTime<b.arrayTime; } int main() { int N,K; cin>>N>>K; int hh,mm,ss,wait; for(int k=0;k<K;k++)window[k]=3600*8; int a=0,i=0; while(a<N) { scanf("%d:%d:%d %d",&hh,&mm,&ss,&wait); if(hh*3600+mm*60+ss<17*3600+1) { Cus[i].arrayTime=hh*3600+mm*60+ss; Cus[i].serveTime=wait*60; i++; } a++; } sort(&Cus[0],&Cus[i],cmp1); int count=0; double total=0; for(int j=0;j<i;j++) { sort(&window[0],&window[K],cmp2); if(window[0]>Cus[j].arrayTime) { total+=(window[0]-Cus[j].arrayTime); window[0]+=Cus[j].serveTime; } else { window[0]=Cus[j].serveTime+Cus[j].arrayTime; } count++; } if(count>0)printf("%.1lf\n",(total/60)/count); else cout<<"0.0"<<endl; return 0; }
相关文章推荐
- iOS之UI随笔-字典转模型以及双模型的构建
- [Leetcode] - 96 Unique Binary Search Trees
- IOS初学笔记UI--UIView
- JPA主键生成策略
- HDU 1815, POJ 2749 Building roads(2-sat)
- UIScrollView与NSTimer计时器、分页指示器控件的使用
- UICollectionView的使用
- hdu5493 Queue 线段树
- note: please rebuild precompiled header ..... /UIKit-2DYE2I2D1B3GL.pcm 解决方案
- 69. Sqrt(x) (Divide-and-Conquer)
- java gui案例开发
- Longest Consecutive Sequence
- 109. Convert Sorted List to Binary Search Tree (List; Divide-and-Conquer, dfs)
- 108.Convert Sorted Array to Binary Search Tree(Array; Divide-and-Conquer, dfs)
- 条款20:宁以pass-by-reference-to-const替换pass-by-value
- servlet中response和request的字符编码问题
- MAVEN ERROR: unable to find valid certification path to requested target 解决办法
- SuiShenJi项目_dialog to Activity动画
- SuiShenJi项目_按钮等背景样式
- SuiShenJi项目_Activity跳转、传值