这道题目WA无数次。
map,去重队列与队列组的妙用。
map 保存对应元素的组序号
去重队列保存出队时对应组号的顺序。
队列组 保存对应组的队列。
入队时查看有没有 对应组的元素在队列中,若有的话插入到对应组的最后一个,若没有直接插入
#include<iostream>
#include<stdio.h>
#include<string>
#include<queue>
#include<map>
#include<fstream>
using namespace std;
int maping[1000000];
class TEAM_QUEUE
{
public:
int r,f;
int a[3000];
void init()
{
r=0;
f=1;
}
bool empty()
{
return r<f;
}
int top()
{
return a[f];
}
void pop()
{
f++;
}
void push(int n)
{
int i;
for(i=f;i<=r;i++)
if(a[i]==n)break;
if(i>r)
a[++r]=n;
}
};
int main()
{
int i,j,k=0;
int n,r;
int ele;
int cases=0;
freopen("h:\\data.txt","r",stdin);
while(scanf("%d",&n)!=EOF)
{
if(n==0)break;
queue<int> que[1005];
TEAM_QUEUE team;
team.init();
memset(maping,0,sizeof(maping));
cases++;
printf("Scenario #%d\n",cases);
for(i=1;i<=n;i++)
{
scanf("%d",&k);
for(j=1;j<=k;j++)
{
scanf("%d",&ele);
maping[ele]=i;
}
}
string str;
int TT;
while(cin>>str)
{
if(str=="STOP")
break;
if(str=="ENQUEUE")
{
scanf("%d",&ele);
if(maping[ele]!=0)
{
team.push(maping[ele]);
que[maping[ele]].push(ele);
}
}
if(str=="DEQUEUE")
{
int temp=que[team.top()].front();
cout<<temp<<endl;
que[team.top()].pop();
while(!team.empty()&&que[team.top()].empty())
team.pop();
}
}
cout<<endl;
}
return 0;
}