题目信息分析:
- 队伍应该只有一条,不是按照窗口来排队,所以不需要根据窗口来设置队伍数量,只要看那个窗口没人就根据顺序来接受服务。
- 题目中说了,没有一个窗口可以超过60分钟。所以再输入的时候应该需要将大于60分钟的对象的处理时间赋值为60minutes。
- 到银行的时间晚于17:00:00(>=17:00:01)都不予以服务,早来的等开门的时间也要记入排队时间
代码思路:
- 将达到时间换算成秒(这样可以避免小数),我这里将到达时间以开门时间(8点)为0值,来早的即为负数(绝对值为等待时间),然后进行排序。
- 判断有效人数是否大于0,不是则提前输出0.0(保留一位小数!!)
- 设置windows[k]为窗口可以处理下一个客户的时间,默认值为0
#include <iostream>
#include <cmath>
#include <string>
#include <algorithm>
using namespace std;
const int maxn = 1e4 + 10;
struct people{
int arrive,process;//到达的时间(分钟)
}info[maxn];
bool cmp(people a, people b) {
return a.arrive < b.arrive;
}
int main() {
int n, k, windows[105] = {0},ans=0;//windows[k]可以处理下一个业务时间
scanf("%d %d", &n, &k);
int H, M, S,co=0;
double P;
for (int i = 0; i < n; i++) {
scanf("%d:%d:%d %lf", &H, &M, &S,&P);
if (H >= 17&&(M>0||S>0)) continue; //除去超过17:00的人
info[co].arrive = (H - 8) * 3600 + M*60 + S;
if (P > 60) P = 60;
info[co].process = P*60;
co++;
}
if (co == 0) {
printf("0.0\n");
return 0;
}
sort(info, info + co,cmp);
for (int i = 0; info[i].arrive < 0; i++) {
ans += 0 - info[i].arrive;
info[i].arrive = 0;
} //早于8点来的需要等到开门
for (int i = 0; i < co; i++) {
int minT=windows[0], index=0;
for (int j = 1; j < k; j++) {
if(windows[j]<minT){
minT = windows[j];
index = j;
}
}
if (windows[index] <= info[i].arrive)
windows[index] = info[i].process+ info[i].arrive;
else {
ans += windows[index] - info[i].arrive;
windows[index] += info[i].process;
}
}
printf("%.1lf", ans / 60.0 /(co*1.0));
return 0;
}