R7-1 银行排队问题之单队列多窗口服务
分数 20
作者 DS课程组
单位 浙江大学
假设银行有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
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
栈限制
8192 KB
#include<bits/stdc++.h>
using namespace std;
class Person
{
public:
int get_time,last_time,wait_time;
Person(int a,int b):get_time(a),last_time(b),wait_time(0) {}
Person() {}
};
class Windows
{
public:
int id,time;
Windows(int a,int b):id(a),time(b) {}
Windows() {}
friend bool operator <(const Windows& a,const Windows& b)
{
if(a.time==b.time)
return a.id>b.id;
return a.time>b.time;
}
};
int searchfree(bool* arr,int len)
{
for(int i=0; i<len; i++)
{
if(arr[i])return i;
}
exit(-2);
return -1;
}
int main()
{
int num1,a,b,num2,time;
cin>>num1;
vector<Person>v;
for(int i=0; i<num1; i++)
{
cin>>a>>b;
b = b>60 ? 60 : b ;
v.push_back(Person(a,b));
}
cin>>num2;
int* win_num=new int[num2];
bool* isfree=new bool[num2];
for(int i=0; i<num2; i++)
{
win_num[i]=0;
isfree[i]=true;
}
int id=0,curtime=0,cus_id=0;
priority_queue<Windows>QW;
while(cus_id<num1)
{
if(QW.empty()||v[cus_id].get_time<QW.top().time)
{
if(QW.size()<num2)
{
curtime=v[cus_id].get_time;
id=searchfree(isfree,num2);
//
}
else
{
curtime=QW.top().time;
id=QW.top().id;
v[cus_id].wait_time=curtime-v[cus_id].get_time;
QW.pop();
}
time=curtime+v[cus_id].last_time;
isfree[id]=false;
QW.push(Windows(id,time));
win_num[id]++;
cus_id++;//到下一个顾客
}
else
{
isfree[QW.top().id]=true;
curtime=QW.top().time;
QW.pop();
}
}
while(!QW.empty())
{
curtime=QW.top().time;
QW.pop();
}
int Max=-1,sum=0;
for(int i=0; i<num1; i++)
{
Max=max(Max,v[i].wait_time);
sum+=v[i].wait_time;
}
cout<<setprecision(1)<<fixed<<(double)sum/num1<<" "<<Max<<" "<<curtime<<endl;
for(int i=0; i<num2; i++)
{
if(i==0)
cout<<win_num[i];
else
cout<<" "<<win_num[i];
}
delete[]isfree;
delete[]win_num;
}