队列练习题
题目描述
假设银行有K个窗口提供服务,窗口前设一条黄线,所有顾客按到达时间在黄线后排成一条长龙。当有窗口空闲时,下一位顾客即去该窗口处理事务。当有多个窗口可选择时,假设顾客总是选择编号最小的窗口。
本题要求输出前来等待服务的N位顾客的平均等待时间、最长等待时间、最后完成时间。
输入
输入第1行给出正整数N(≤1000),为顾客总人数;随后N行,每行给出一位顾客的到达时间T和事务处理时间P,并且假设输入数据已经按到达时间先后排好了顺序;最后一行给出正整数K(≤10),为开设的营业窗口数。
输出
在一行中输出平均等待时间(输出到小数点后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 62
- 代码
#include<iostream>
#include<iomanip>
using namespace std;
#define MaxTime 999
int main(){
double avgWaitTime=0, longWaitTime=0, finishTime=0, wholeWaitTime=0;
int k, n;
int *arriveTime, *usedTime;
int *windowsNeedTime; //每个窗口花费时间
cin >> n;
arriveTime = new int[n];
usedTime = new int[n];
windowsNeedTime = new int[n]();
for(int i=0; i<n; i++){
cin >> arriveTime[i] >> usedTime[i];
}
cin >> k;
for(int i=0; i<n; i++){
int min = MaxTime;
int wPos = -1;
//判断是否有窗口空闲
for(int j=0; j<k; j++){
if(windowsNeedTime[j] < arriveTime[i]){
wPos = j;
windowsNeedTime[j] = arriveTime[i];
break;
}
}
//没有窗口空闲,选择时间最短窗口
if(wPos == -1){
for(int j=0; j<k; j++){
if(min > windowsNeedTime[j]){
min = windowsNeedTime[j];
wPos = j;
}
}
}
//更新等待总时间
wholeWaitTime += windowsNeedTime[wPos] - arriveTime[i];
//更新最长等待时间
if(longWaitTime < windowsNeedTime[wPos] - arriveTime[i]){
longWaitTime = windowsNeedTime[wPos] - arriveTime[i];
}
//已经选择了窗口
windowsNeedTime[wPos] += usedTime[i];
}
//窗口最大时间为最后完成时间
for(int i=0; i<k; i++){
if(finishTime < windowsNeedTime[i]){
finishTime = windowsNeedTime[i];
}
}
//平均等待时间
avgWaitTime = wholeWaitTime / n;
cout << fixed << setprecision(1) << avgWaitTime << ' ' << setprecision(0) << longWaitTime << ' ' << finishTime << endl;
return 0;
}