一、题目描述
假设银行有K个窗口提供服务,窗口前设一条黄线,所有顾客按到达时间在黄线后排成一条长龙。当有窗口空闲时,下一位顾客即去该窗口处理事务。当有多个窗口可选择时,假设顾客总是选择编号最小的窗口。
本题要求输出前来等待服务的N位顾客的平均等待时间、最长等待时间、最后完成时间。
二、输入与输出
1.输入
输入第1行给出正整数N(≤1000),为顾客总人数;
随后N行,每行给出一位顾客的到达时间T和事务处理时间P,并且假设输入数据已经按到达时间先后排好了顺序;最后一行给出正整数K(≤10),为开设的营业窗口数。
9
0 20
1 15
1 61
2 10
10 5
10 3
30 18
31 25
31 2
3
2.输出
在一行中输出平均等待时间(输出到小数点后1位)、最长等待时间、最后完成时间,之间用1个空格分隔,行末不能有多余空格。
6.2 17 62
三、参考代码
#include<iostream>
#include<queue>
#include<iomanip>
#include<math.h>
#include<stack>
using namespace std;
class Cus
{
public:
int arr;
int cost;
};
int main()
{
int peo;
cin >> peo;
Cus* cus = new Cus[peo];
for (int i = 0; i < peo; i++)
{
cin >> cus[i].arr >> cus[i].cost;
}
int k;
cin >> k;
int* window = new int[k];
int sumt = 0, maxt = 0, overt = 0;
for (int i = 0; i < k; i++) {
window[i] = cus[i].arr + cus[i].cost;
}
queue<Cus>waiting;
int gogo = 0;
for (int i = k; i < peo; i++)
{
int flag = 1;
gogo = window[0];
for (int j = 0; j < k; j++) {
if (window[j] < gogo) {
gogo = window[j];
}
}
if (cus[i].arr < gogo)
{
waiting.push(cus[i]);
}
else
{
while (cus[i].arr >= gogo && flag)
{
if (waiting.empty())
{
for (int j = 0; j < k; j++)
{
if (cus[i].arr == window[j])
{
window[j] += cus[i].cost;
flag = 0;
break;
}
else if (cus[i].arr > window[j])
{
window[j] = cus[i].arr + cus[i].cost;
flag = 0;
break;
}
}
gogo = window[0];
for (int j = 0; j < k; j++) {
if (window[j] < gogo)
{
gogo = window[j];
}
}
}
else
{
sumt += gogo - waiting.front().arr;
if (gogo - waiting.front().arr > maxt)
{
maxt = gogo - waiting.front().arr;
}
for (int j = 0; j < k; j++)
{
if (gogo == window[j])
{
window[j] = gogo + waiting.front().cost;
break;
}
}
waiting.pop();
gogo = window[0];
for (int j = 0; j < k; j++) {
if (window[j] < gogo)
{
gogo = window[j];
}
}
if (cus[i].arr < gogo)
{
waiting.push(cus[i]);
}
}
}
}
}
while (!waiting.empty())
{
sumt += gogo - waiting.front().arr;
if (gogo - waiting.front().arr > maxt)
{
maxt = gogo - waiting.front().arr;
}
for (int j = 0; j < k; j++)
{
if (gogo == window[j])
{
window[j] = gogo + waiting.front().cost;
}
}
waiting.pop();
}
for (int j = 0; j < k; j++)
{
if (window[j] > overt)
{
overt = window[j];
}
}
cout << fixed << setprecision(1) << (sumt * 1.0) / peo << " " << maxt << " " << overt;
return 0;
}