besthacker2的第二题,模拟了22遍才模拟对,详细看代码吧,所有细节都已标出。
附代码:
#include
#include
#include
#include
using namespace std;
int n,t,k,m;
struct node
{
int st,et,p,v,mb;
} cc[1001];
int main()
{
int T;
cin>>T;
while (T--)
{
scanf("%d%d%d%d",&n,&t,&k,&m);
for (int i=1;i<=m;i++)
{
int a,b;
int p,v;
scanf("%d:%d%d%d",&a,&b,&p,&v);
cc[i].st=a*60+b;
cc[i].p=p;
cc[i].v=v;
cc[i].mb=0;
}
int cur=1;
for (int i=cc[1].st;;i+=t) //i代表当前这次炒饭的起始时间
{
int p=cc[cur].p;
int v=k; //当前这次炒饭最多炒这么多
if (vm) //如果当前需要满足的人已经超过队列长度,则处理完毕
break;
i=cc[cur].st-t>i?cc[cur].st-t:i; //下一个开始炒饭时间为下一个人来的时间和这次炒饭完成时间的较大者,循环中+t
}
}
for (int i=1;i<=m;i++)
{
int a=cc[i].et/60;
a%=24;
int b=(cc[i].et)%60;
printf("%02d:%02d
",a,b);
}
if (T)
printf("
");
}
}