此题只要老老实实按题目来不要想太多,,,
例如最后一个点。。。我特判了最后处理完超过五点的情况就按五点处理
想着人家都关银行了,,你就等到5点就得走了,,结果发现想多了,,
思路:
1.先把超过五点的搞掉,没来过,没来过,,
2. 少于窗口 特判8点
3. 等于窗口数,拉出队列中最早结束的那个,与现在这个对比,如果发现现在那位要等最早那位一会,那就时间加上呗
注:全部搞为秒来会很舒服
代码如下:
#include <bits/stdc++.h>
using namespace std;
struct stu{
int times; //到达时间
int P; //处理时间
}ren[10005];
double avtime;
priority_queue <stu> que;
bool operator < (const stu &A , const stu &B){
return A.times > B.times;
} //已经在办事的人按谁早谁出来
int comp(stu A, stu B){
return A.times < B.times;
} //等待的人按时间排
const int eight = 8*3600,fif = 17 * 3600;//直接化秒
int main()
{
int N,wins,s,f,m,pp,sumtime,n = 0;
scanf("%d%d",&N,&wins);
for (int i = 0; i < N; i++){
scanf("%d:%d:%d %d",&s,&f,&m,&pp);
sumtime = s*3600 + f*60 +m;
pp *= 60;
if( sumtime >= fif) continue; //超时了
else {
ren[n].times = sumtime;
ren[n++].P = pp;
}
//存档时间
}
sort(ren,ren+n,comp);
//走位走位
//对每个进入的人继续时间计算即可
for (int i = 0; i < n; i++)
{
stu nows;
if(que.size() < wins){ //少于窗口数 特判八点
if(ren[i].times < eight) {
avtime += eight - ren[i].times;
ren[i].times = eight;
}
}
else{
stu lasts;
lasts = que.top(); que.pop();
if(lasts.times > ren[i].times) { //如果要等
avtime += lasts.times - ren[i].times;
ren[i].times = lasts.times;
}
}
nows.times = ren[i].P + ren[i].times;
que.push(nows);
}
avtime /= n*60;
printf("%.1f",avtime);
return 0;
}