问题 D: DS队列----银行单队列多窗口模拟
时间限制: 1 Sec 内存限制: 128 MB
提交: 339 解决: 240
[提交][状态][讨论版]
题目描述
假设银行有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<queue>
using namespace std;
struct people {
int t;//到达时间
int p;//处理事务时间
int sum;//总计时间
};
int come(people* w, int _w,int time) {//定义函数返回顾客应当前往的窗口
int index = 0, item = 9999;
for (int i = 0; i < _w; i++) {
if(time>w[i].sum){
index=i;
break;
}
if (item > w[i].sum) {
item = w[i].sum;
index = i;
}
}
return index;
}
int main() {
int n, w;//w为窗口数
cin >> n;
int i;
queue <people> cus;
int* wait;
wait = new int[n];
for (int i = 0; i < n; i++) {//输入顾客数据
people p;
cin >> p.t;
cin >> p.p;
p.sum = p.t + p.p;
cus.push(p);
}
cin >> w;
people* win;
win = new people[w];
for (i = 0; i < w; i++) {//创建数组输入前三名顾客
win[i] = cus.front();
wait[i] = 0;
cus.pop();
}
while (!cus.empty()) {// 此处sum可看成当前时间
int index;//需替换窗口位置
int clock;//当前时刻
index = come(win, w,cus.front().t);
if ((win[index].sum - cus.front().t) > 0) {//判断是否窗口有空挡期
wait[i] = win[index].sum - cus.front().t;
}
else {//有则sum应换成当前时间
win[index].sum=cus.front().t;
};
clock = win[index].sum + cus.front().p;
win[index] = cus.front();
win[index].sum = clock;
i++;
cus.pop();
}
int longest=0, last=0;
double total = 0;
for (i = 0; i < n; i++) {//由wait数组求出平均等待时间,最长等待时间
total += wait[i];
if (wait[i] > longest) longest = wait[i];
}
for (i = 0; i < w; i++) {//sum得到最后完成时间
if (win[i].sum > last) last = win[i].sum;
}
printf("%.1f %d %d", total / n, longest, last);
}