PAT1017
题意:有一个银行,给了n个客户,k个窗口。已知每个客户的到达时间和需要服务的时长。当一个客户到达的时候,如果正好有空的窗口,就直接服务。如果没有空则要在一列长队排队。求客户的平均等待时长。银行开放时间为8点到17点,8点之前来的人都要等待,在17点后来的人不服务。
思路:把时分秒的时间转化成一个整数,用于比较大小。用结构体来存储每个客户的两个时间所转化的数值,然后通过优先队列按照规则贪心地提供服务,算出最短时间之后就可以算出平均最短时间
#include <iostream>
#include <queue>
#include <algorithm>
using namespace std;
const int maxn = 10005;
struct P
{
int in,t;
} p[10005];
int cmp(P p1, P p2)
{
return p1.in<p2.in;
}
int n,k,cnt,ans;
priority_queue< int, vector<int>, greater<int> > q;
int main()
{
scanf("%d%d",&n,&k);
for(int i=1;i<=n;i++)
{
int hh,ss,mm,tt;
scanf("%d:%d:%d %d",&hh,&mm,&ss,&tt);
int sum=hh*3600+mm*60+ss;
if(sum>61200)//15点
continue;
p[++cnt].t=tt*60;
p[cnt].in=sum;
}
sort(p+1,p+cnt+1,cmp);
for(int i=1;i<=k;i++)
q.push(28800);
for(int i=1;i<=cnt;i++)
{
if(q.top()<=p[i].in)
q.push(p[i].in+p[i].t);
else
{
ans+=q.top()-p[i].in;
q.push(q.top()+p[i].t);
}
q.pop();
}
if(cnt)
printf("%.1lf",((double)ans/60.0)/(double)cnt);
else
printf("0.0\n");
}