注意事项:
题意要求“只有来晚了的人不能被服务”,但是如果等待导致超时是可以被服务的,这是最后一个测试点过不了的原因;
所有到的比较早的客人都需要等到8点钟
不用先将每个窗口填满,在查找最早结束窗口时候,可以以第1个窗口作为标的,这样可以节约代码行;
这道题可以不用队列,用数组来做;
思路:
结构体GUEST存储客人的到达时间和操作时间;WINDOW数组存放窗口的结束时间;
在录入数据的时候,处理到达时间,并清除掉不满足条件的数据之后按照到达时间排序;
遍历整个数组;
查找最先结束的那个窗口;
如果这个客人的到达时间过早,那么就调整到达时间以及修改等待时间;
如果到达时间比这个窗口的结束时间要早,说明要等待,否则就无需等待;
更新这个窗口的结束时间;
AC CODE:
#include <iostream>
#include <queue>
using namespace std;
const int maxn = 10010;
struct PERSON{
int arr,pro;
};
int table[maxn];
struct rule{
bool operator()(PERSON a,PERSON b){
return a.arr>b.arr;
}
};
priority_queue<PERSON,vector<PERSON>,rule> q;
int n,k,cnt_person=0;
double sum=0;
int findtable(){
int id=0,time=0x3fffff;
for(int i=0;i<k;i++){
if(time > table[i]){
time = table[i];
id = i;
}
}
return id;
}
int main() {
fill(table,table+maxn,8*3600);
cin >> n >> k;
for(int i=0;i<n;i++){
PERSON tmp;
int h,m,s;
scanf("%d:%d:%d %d",&h,&m,&s,&tmp.pro);
tmp.arr = h*3600+m*60+s;
q.push(tmp);
}
while(!q.empty()){
PERSON tmp = q.top();
q.pop();
int table_index = findtable();
if(tmp.arr>17*3600) break;
if(tmp.arr<table[table_index]){//有等待就更新等待时间和桌子结束时间
sum += table[table_index]-tmp.arr;
table[table_index] += tmp.pro*60;
}else table[table_index] = tmp.arr + tmp.pro*60 ;
cnt_person++;
}
if(cnt_person==0) cout << "0.0";
else printf("%.1f",sum/cnt_person/60);
return 0;
}