PTA 7-12 银行排队问题之单窗口“夹塞”版 (30 分)
#include <iostream>
#include <cstdio>
#include <queue>
#include<map>
#include<algorithm>
using namespace std;
struct customer
{
string name;
int arrive;
int service;
int wait;
int friendship;
bool vis;
};
int main()
{
int n,m,l,c=1,ST=0;
double sumwaittime=0;
map<string,int> fri;
string name;
cin>>n>>m;
for(int i=0;i<m;i++)
{
cin>>l;
for(int j=0;j<l;j++)
{
cin>>name;
fri[name]=c;
}
c++;
}
customer cus[n];
for(int i=0;i<n;i++)
{
cin>>cus[i].name>>cus[i].arrive>>cus[i].service;
if(cus[i].service>60)
{
cus[i].service=60;
}
cus[i].friendship=fri[cus[i].name];
cus[i].vis=false;
}
for(int i=0;i<n;i++)
{
if(cus[i].friendship==0&&cus[i].vis==false)
{
cus[i].wait=max(ST-cus[i].arrive,0);
ST=max(ST+cus[i].service,cus[i].arrive+cus[i].service);
sumwaittime+=cus[i].wait;
cus[i].vis=true;
cout<<cus[i].name<<endl;
}
else if(cus[i].vis==false)
{
cus[i].wait=max(ST-cus[i].arrive,0);
ST=max(ST+cus[i].service,cus[i].arrive+cus[i].service);
sumwaittime+=cus[i].wait;
cus[i].vis=true;
cout<<cus[i].name<<endl;
for(int j=i+1;j<n;j++)
{
if(cus[j].friendship==cus[i].friendship&&cus[j].vis==false&&cus[j].arrive<=ST)
{
cus[j].wait=max(ST-cus[j].arrive,0);
ST=max(ST+cus[j].service,cus[j].arrive+cus[j].service);
sumwaittime+=cus[j].wait;
cus[j].vis=true;
cout<<cus[j].name<<endl;
}
}
}
}
printf("%.1f",sumwaittime/n);
return 0;
}