假设银行有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
按照题意简单模拟,注意处理时间不会超过60这个条件
#include<iostream>
#include<string>
#include<stack>
#include<vector>
#include<cstdio>
#include<cstring>
#include<map>
#include<queue>
#include<algorithm>
#include<iomanip>
using namespace std;
const int INF=0xfffffff;
struct peo
{
int l,r;
};
int in[10],num[10];
peo per[1000];
int main()
{
int n;
cin>>n;
for(int i=0;i<n;i++)
{
cin>>per[i].l>>per[i].r;
if(per[i].r>60)
per[i].r=60;
}
int k;
cin>>k;
fill(in,in+k,0);
fill(num,num+k,0);
int all_time=0,max_time=0,min_time=INF,min_i=0;
for(int i=0;i<n;i++)
{
min_time=INF;
bool flag=false;
for(int j=0;j<k;j++)
{
if(min_time>in[j])
{
min_time=in[j];
min_i=j;
}
if(in[j]<=per[i].l)
{
in[j]=per[i].l;
in[j]+=per[i].r;
num[j]++;
flag=true;
break;
}
}
if(!flag)
{
int p=min_time-per[i].l;
all_time+=p;
max_time=max(max_time,p);
in[min_i]+=per[i].r;
num[min_i]++;
}
}
sort(in,in+k,greater<int>());
cout<<setprecision(1)<<fixed<<double(all_time)/((double)n)<<" "<<max_time<<" "<<in[0]<<endl;
for(int i=0;i<k;i++)
{
if(i==0)
cout<<num[i];
else
cout<<" "<<num[i];
}
cout<<endl;
}