注意点:客户迟到和早到所带来的影响,后面三个测试点不过的原因在这。
#include <cstdio>
#include <algorithm>
using namespace std;
const int INF=1000000;
const int maxn=10010;
int Window[200];
struct customer{
int arrive_time,process_time,wait_time;//s为单位
}Cus[maxn];
int cor[maxn];
int N,K;
bool cmp(int a,int b){
return Cus[a].arrive_time<Cus[b].arrive_time;
}
int main(void){
scanf("%d%d",&N,&K);
for(int i=0;i<K;i++){
Window[i]=8*60*60;
}
for(int i=0;i<N;i++){
int h,m,s;
scanf("%d:%d:%d %d",&h,&m,&s,&Cus[i].process_time);
if(Cus[i].process_time>60) Cus[i].process_time=60;
Cus[i].process_time*=60;
Cus[i].arrive_time=h*60*60+m*60+s;
cor[i]=i;
}
sort(cor,cor+N,cmp);
int sum=0,cnt=0;
for(int i=0;i<N && Cus[cor[i]].arrive_time<=17*60*60;i++){
int Min=INF,id;
for(int j=0;j<K;j++){
if(Min>Window[j]){
Min=Window[j];
id=j;
}
}
//注意点所要注意的地方,切记更新相应信息
if(Window[id]<Cus[cor[i]].arrive_time){
Cus[cor[i]].wait_time=0;
Window[id]+=Cus[cor[i]].arrive_time-Window[id];
}
else {
Cus[cor[i]].wait_time=Window[id]-Cus[cor[i]].arrive_time;
}
Window[id]+=Cus[cor[i]].process_time;
sum+=Cus[cor[i]].wait_time;
cnt++;
}
if(cnt==0) printf("0.0");
else printf("%.1f",1.0*sum/(60*cnt));
return 0;
}