这道题水过,直接开个二维数组,然后模拟Team Queue!这道题还可以改进一下,就是用数组模拟一个循环链表,不过貌似有点麻烦。
下面是代码:
#include<stdio.h>
#include<string.h>
#define MAXN 5005
int Q[MAXN][1005];
int hash[1000000];
int n,m,flag;
int last=1003,num=1004;
void enqueue(int x)
{
int i,j;
int tag=0;
for(i=1;;i++)//找到x要插入的team
{
if(hash[x]==Q[i][0]&&Q[i][num]!=0)
{
tag=1;
break;
}
if(Q[i][0]==-1) break;
}
if(tag)//如果x能够插队
{
++Q[i][last];
Q[i][Q[i][last]]=x;
++Q[i][num];
}
else//x不能插队
{
Q[i][1]=x;
Q[i][0]=hash[x];
Q[i][last]=Q[i][num]=1;
}
}
void dequeue()
{
for(int j=1;;j++)
{
if(Q[flag][j]!=-1)
{
printf("%d\n",Q[flag][j]);
Q[flag][j]=-1;
--Q[flag][num];
if(Q[flag][num]==0) ++flag;
return;
}
}
}
int main()
{
int T=0;
while(scanf("%d",&n),n)
{
++T;
for(int i=0;i<n;i++)
{
scanf("%d",&m);
int t;
for(int j=0;j<m;j++)
{
scanf("%d",&t);
hash[t]=i;
}
}
memset(Q,-1,sizeof(Q));
printf("Scenario #%d\n",T);
char s[10];
flag=1;
while(scanf("%s",s)&&s[0]!='S')
{
if(s[0]=='E')
{
int x;
scanf("%d",&x);
enqueue(x);
}
if(s[0]=='D') dequeue();
}
printf("\n");
}
return 0;
}