第一遍刷PAT
题目意思
坑:
如果窗口时间超过下班时间,不做任何特殊处理(emmmmmm mmp)
我的憨憨程序
#include<iostream>
#include<queue>
#define CLOSE_TIME 17*60*60
using namespace std;
struct client{
int h,m,s,pro_time;
int arr_time;
friend bool operator<(client a,client b)
{
return a.arr_time>b.arr_time;
}
};
struct window{
int id;
int now_time;
friend bool operator<(window a,window b)
{
return a.now_time>b.now_time;
}
};
priority_queue<client> qc;
priority_queue<window> qw;
int main()
{
int N,K;
double ans=0.0,cnt=0.0;//浮点数还是初始化成0.0吧//浮点数还是用double吧 不然.5的好像不进位
client c;
window w;
scanf("%d%d",&N,&K);
for(int i=0;i<N;i++)
{
scanf("%d:%d:%d %d",&c.h,&c.m,&c.s,&c.pro_time);
c.arr_time=c.h*60*60+c.m*60+c.s;
if(c.arr_time<=CLOSE_TIME) //某客户17点之后到的不给服务也不算进平均值, 17点可以
qc.push(c);
}
for(int i=0;i<K;i++)//初始化窗口时间
{
w.id=i;
w.now_time=8*60*60;
qw.push(w);
}
while(!qc.empty())
{
c=qc.top();//当前排第一的客户
qc.pop();
w=qw.top();//最早空出来的窗口
// if(w.now_time>CLOSE_TIME)//有些人等到最后也没轮到 这个居然不算???
// {
// ans+=CLOSE_TIME-c.arr_time;
// cnt+=1;
// continue;
// }
qw.pop();
if(w.now_time>c.arr_time)//来了要等
{
ans+=w.now_time-c.arr_time;
//if(w.now_time<=CLOSE_TIME) //??这我就纳闷了
w.now_time+=c.pro_time*60;
}
else//来了不用等 bug点
w.now_time=c.pro_time*60+c.arr_time;
cnt+=1;
qw.push(w);
}
cnt*=60.0;
if(cnt==0)
printf("0.0\n");
else
printf("%.1f\n",ans/cnt);
return 0;
}