7-8 银行排队问题之单窗口“夹塞”版
假设银行有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
模拟题,在网上看发现用map和vector比较简单。
map<string,int>mp; //这个可将不同名字(即字符串不同)表示整形数值一样
此题是用来模拟一个一个的朋友圈 代码示例: if(mp[a[i].name]==mp[a[j].name])
vector<string>vec; //这是一个可以存放字符串的容器,很方便!
push_back() 在Vector最后添加一个元素(参数为要插入的值)
例: vec.push_back(a[i].name);
输出例:for(int i = 0; i < n; i++)
{
cout << vec[i] << endl;
}
思路代码见:
:
#include <bits/stdc++.h>
using namespace std;
struct waiter{
int ar;
int cl;
int wait;
string name;
}a[10010];
vector<string>vec;
map<string,int>mp;
int b[10010]; //表示某人有没有办理好 0是没有
int main()
{
int sum=0; //处理完事务时间和
int waitsum=0; //客户等待时间和
int n,m,c;
string s;
scanf("%d %d",&n,&m);
for(int i=1;i<=m;i++)
{
cin>>c;
for(int j=1;j<=c;j++)
{
cin>>s;
mp[s]=i;
}
}
for(int i=1;i<=n;i++)
{
cin>>a[i].name;
cin>>a[i].ar>>a[i].cl;
if(a[i].cl>60)
a[i].cl=60;
}
for(int i=1;i<=n;i++)
{
if(b[i]==0)
{
if(a[i].ar>sum) //这是客户来的晚的情况
sum=a[i].ar;
a[i].wait=sum-a[i].ar; //等待时间=处理完事务时间-到的时间
sum+=a[i].cl;
vec.push_back(a[i].name);
b[i]=1;
for(int j=i+1;j<=n;j++)
{
if(b[j]==0)
{
if(mp[a[i].name]==mp[a[j].name]) //判断能否加塞
{
if(a[j].ar<=sum) //要加塞的人必须在上个人事情处理完之前到
{
a[j].wait=sum-a[j].ar;
sum+=a[j].cl;
vec.push_back(a[j].name);
b[j]=1;
}
}
}
}
}
}
for(int i=1;i<=n;i++)
waitsum+=a[i].wait;
for(int i=0;i<n;i++)
{
cout << vec[i] << endl;
}
printf("%.1lf",waitsum*1.0/n);
}