假设银行有K个窗口提供服务,窗口前设一条黄线,所有顾客按到达时间在黄线后排成一条长龙。当有窗口空闲时,下一位顾客即去该窗口处理事务。当有多个窗口可选择时,假设顾客总是选择编号最小的窗口。
本题要求输出前来等待服务的N位顾客的平均等待时间、最长等待时间、最后完成时间,并且统计每个窗口服务了多少名顾客。
输入格式:
输入第1行给出正整数N(≤1000),为顾客总人数;随后N行,每行给出一位顾客的到达时间T和事务处理时间P,并且假设输入数据已经按到达时间先后排好了顺序;最后一行给出正整数K(≤10),为开设的营业窗口数。这里假设每位顾客事务被处理的最长时间为60分钟。
输出格式:
在第一行中输出平均等待时间(输出到小数点后1位)、最长等待时间、最后完成时间,之间用1个空格分隔,行末不能有多余空格。
在第二行中按编号递增顺序输出每个窗口服务了多少名顾客,数字之间用1个空格分隔,行末不能有多余空格。
输入样例:
9
0 20
1 15
1 61
2 10
10 5
10 3
30 18
31 25
31 2
3
输出样例:
6.2 17 61
5 3 1
#include <iostream>
using namespace std;
struct Node {
int T,
P,
wait;
}user[1000];
int main() {
int N, K, window[11] = { 0 }, cnt[11] = { 0 };
cin >> N;
for (int i = 0; i < N; ++i) {
cin >> user[i].T >> user[i].P;
if (user[i].P > 60)user[i].P = 60;
}
cin >> K;
for (int i = 0; i < N; ++i) {
int tmp = 1;
for (int j = 2; j <= K; ++j) {
if (user[i].T >= window[tmp])
break;
if (window[tmp] > window[j])
tmp = j;
}
cnt[tmp]++;
if (user[i].T >= window[tmp]) {
user[i].wait = 0;
window[tmp] = user[i].T + user[i].P;
}
else {
user[i].wait = window[tmp] - user[i].T;
window[tmp] = window[tmp] + user[i].P;
}
}
int sum = 0, maxwait = 0, finish = 0;
for (int i = 0; i < N; ++i) {
sum += user[i].wait;
maxwait = max(maxwait, user[i].wait);
}
finish = *max_element(window, window + K + 1);
printf("%.1lf %d %d\n", 1.0 * sum / N, maxwait, finish);
for (int i = 1; i <= K; ++i)
cout << (i == 1 ? "" : " ") << cnt[i];
return 0;
}