Files
OI-source/2.822.cpp
2023-08-03 09:22:52 +08:00

102 lines
2.9 KiB
C++

#include<cstdio>
#include<algorithm>
#include<vector>
using namespace std;
struct topic
{
int tid,num,t0,t,dt,q_num,finished;
};
struct member
{
int pid,k,work_left,last;
vector<int>pidk;
inline bool operator <(const member&a) const
{
if(a.last==last) return a.pid>pid;
else return a.last>last;
}
};
vector<topic> topics;
vector<member> staff;
int m,n,kase,time,need,z,i,j,k,x;
int main()
{
#ifdef local
freopen("pro.in","r",stdin);
#endif
while(scanf("%d",&m)==1&&m)
{
time=need=z=0;
while(m--)
{
topic a;
scanf("%d%d%d%d%d",&a.tid,&a.num,&a.t0,&a.t,&a.dt);
a.q_num=a.finished=0;
topics.push_back(a);
}
scanf("%d",&n);
while(n--)
{
z++;
member a;
a.work_left=a.last=0;
scanf("%d%d",&a.pid,&a.k);
a.pid=z;
for(i=0;i<a.k;i++)
{
scanf("%d",&x);
a.pidk.push_back(x);
}
staff.push_back(a);
}
while(true)
{
for(i=0;i<topics.size();i++)
if(time>=topics[i].t0
&&topics[i].finished+topics[i].q_num<topics[i].num)
{
topics[i].t0+=topics[i].dt;
topics[i].q_num=
min(++topics[i].q_num,topics[i].num-topics[i].finished);
}
sort(staff.begin(),staff.end());
for(i=0;i<staff.size();i++)
{
if(!staff[i].work_left)
for(j=0;j<staff[i].pidk.size();j++)
for(k=0;k<topics.size();k++)
if(staff[i].pidk[j]==topics[k].tid&&topics[k].q_num)
{
staff[i].last=time;
staff[i].work_left=topics[k].t;
topics[k].q_num--;
need=max(need,topics[k].t);
if(++topics[k].finished==topics[k].num)
{
topics.erase(topics.begin()+k);
if(!topics.size())
{
time+=need;
goto END;
}
}
goto NEXT_P;
}
NEXT_P:
continue;
}
time++;
need=max(--need,0);
for(i=0;i<staff.size();i++)
staff[i].work_left=max(--staff[i].work_left,0);
}
END:
printf("Scenario %d: All requests are serviced within %d minutes.\n"
,++kase,time);
staff.clear();
topics.clear();
}
return 0;
}