D. DS队列----银行单队列多窗口模拟
题目描述
假设银行有K个窗口提供服务,窗口前设一条黄线,所有顾客按到达时间在黄线后排成一条长龙。当有窗口空闲时,下一位顾客即去该窗口处理事务。当有多个窗口可选择时,假设顾客总是选择编号最小的窗口。
本题要求输出前来等待服务的N位顾客的平均等待时间、最长等待时间、最后完成时间。
输入
输入第1行给出正整数N(≤1000),为顾客总人数;随后N行,每行给出一位顾客的到达时间T和事务处理时间P,并且假设输入数据已经按到达时间先后排好了顺序;最后一行给出正整数K(≤10),为开设的营业窗口数。
输出
在一行中输出平均等待时间(输出到小数点后1位)、最长等待时间、最后完成时间,之间用1个空格分隔,行末不能有多余空格。
输入样例1 <-复制
9
0 20
1 15
1 61
2 10
10 5
10 3
30 18
31 25
31 2
3
输出样例1
6.2 17 62
是错的!只不过是我突发奇想抽风想用模拟来做而已
#include<iostream>
#include<unordered_map>
using namespace std;
class Clock{
private:
int systime;
public:
void Clock(){
systime=0;
}
void nextSecond(){
systime++;
}
void getSystemTime(){
return systime;
}
};
class Customer{
private:
int time,cost;
public:
void Customer(int t,int c):time(t),cost(c){};
void Customer(){
time=0;
cost=0;
}
void set(int t,int c){
time=t;
cost=c;
}
int time(){return time;}
int cost(){return cost;}
};
class WindowManager{
private:
bool isFree;
int endTime;
public:
void WindowManager(){
isFree=1;
endTime=0;
}
void startWork(int cost){
endTime=cost;
}
void timepass(){
if(!isFree)
endTime--;
if(endTime==0) isFree=1;//等待出口
}
bool iF() {return isFree;}
};
int FindFreeWindows(WindowManager w*,int k){
for(int i=0;i<k;i++){
if(*(w+i)->iF()==1)
return i;
}
return -1;
}
int main(){
int n;
cin>>n;
int time,cost;
Customer c[n];
for(int i=0;i<n;i++){
cin>>time>>cost;
c[i].set(time,cost);
}
Clock cl;
int K,i=0;
cin>>K;
WindowManager *w=new WindowManager[K];
while(i<n){
if(c[i].time()>=cl.getSystemTime())
{ int f=findFreeWindows(w,K);
if(f!=-1){
w[f].startWork(c[i].cost());
i++;
//sum+=systime-cometime这样才对吧 最长等待时间打个雷台 最后完成时间就是最后一个窗口的空闲时间
}
else{//全部窗口忙线,线程等待
//统计等待时间 用系统时间减到达时间然后放进sum 但是可能存在排队人数过多而无法确切统计等待时间之情况
continue;
}
}
for(int i=0;i<K;i++)w[i].timepass();//银行处理
cl.nextSecond(); //时钟处理
}
}