与1014题类似,不过这次我不模拟时间了,看网上其他人用小根堆时间复杂度会更低,为O(n*log(k)),我的做法就是O(n*k)的:
#include<bits/stdc++.h>
using namespace std;
struct node{
int atime;
int need;
int wtime;
};
bool cmp(node a, node b){
return a.atime<b.atime;
}
int main(){
int n,k;
scanf("%d%d",&n,&k);
vector<int> poptime(k,60*60*8);
vector<node> cus;
// vector<bool> valid(n,true);
for(int i=0;i<n;i++){
node nod;
int H,m,s,need,atime; scanf("%d:%d:%d %d",&H,&m,&s,&need);
atime=60*60*H+60*m+s;
if(atime>60*60*17) continue;
nod.atime=atime; nod.need=need*60;
cus.push_back(nod);
}
n=cus.size();
sort(cus.begin(),cus.end(),cmp);
int index;
for(index=0;index<n;index++){
int mintime=poptime[0],mini=0;
for(int i=1;i<k;i++){
if(mintime>poptime[i]){
mintime=poptime[i];
mini=i;
}
}
if(cus[index].atime<mintime){
cus[index].wtime=mintime-cus[index].atime;
poptime[mini]=mintime+cus[index].need;
}else{
cus[index].wtime=0;
poptime[mini]=cus[index].atime+cus[index].need;
}
}
float avg=0.0;
for(int i=0;i<n;i++){
avg+=cus[i].wtime;
}
avg=n==0?0.0:avg/60/n;
printf("%.1f",avg);
}