1017. Queueing at Bank (25)
第一次是按分钟走,错了半天。
第二次是顾客在17点前到,但17点前无法得到服务,应该得到服务。
#include<cstdio>
#include<string.h>
#include<algorithm>
using namespace std;
#define arrived (p[turn].hh*3600+p[turn].mm*60+p[turn].ss)
const int N=10002,st=8*60*60,et=17*60*60;
int n,m,wd[102],cnt;
struct people{
int hh,mm,ss,pro,wait;
}p[N];
int cmp(people a,people b){
if(a.hh!=b.hh)
return a.hh<b.hh;
if(a.mm!=b.mm)
return a.mm<b.mm;
return a.ss<b.ss;
}
int solve(){
int turn=0;
memset(wd,-1,sizeof wd);
for(int tm=st;;tm++){
if(arrived>et) break;
for(int i=0;i<m;i++){
if(wd[i]==-1){//窗口为空
int wait=tm-arrived;
if(wait>=0){
p[turn].wait=wait,wd[i]=turn++;
if(turn>=n) return n;
}
}
if(wd[i]!=-1)
if(--p[wd[i]].pro==0)
wd[i]=-1;
}
}
return turn;
}
int main(){
scanf("%d %d",&n,&m);
for(int i=0;i<n;i++)
scanf("%d:%d:%d %d",&p[i].hh,&p[i].mm,&p[i].ss,&p[i].pro),p[i].wait=0,p[i].pro*=60;
sort(p,p+n,cmp);
cnt=solve();
double sum=0;
for(int i=0;i<n;i++)
sum+=p[i].wait;
printf("%.1lf\n",cnt?sum/cnt/60:0);
return 0;
}