题目连接:点击打开链接
题目大意:
给出多个集合,之后有
ENQUEUE:将编号插入队列中最后的一个和该编号处在同一集合编号的后面,如果没有插在队列最后。
DEQUEUE:将队头元素出列,并输出。
STOP:终止访问。
三种操作。
解题思路:无论如何插入,同一集合的编号总是挨着,也就是说对于最后的队列,只要知道集合的先后顺序,再将数字
插入每个集合所在队列,之后按顺序输出即可。
代码:
#include<stdio.h>
#include<string.h>
#include<queue>
using namespace std;
#include<map>
int main()
{
int i,j,k,m,n,t,x;
char s1[10];
x=1;
while(scanf("%d",&t),t!=0)
{
queue<int> b[1010],q;
map<int,int> c;
for(i=1;i<=t;i++)
{
scanf("%d",&n);
for(j=0;j<n;j++)
{
scanf("%d",&m);
c[m]=i;
}
}
printf("Scenario #%d\n",x++);
while(scanf("%s",s1),s1[0]!='S')
{
if(s1[0]=='E')
{
scanf("%d",&m);
int t1=c[m];
if(b[t1].empty())
q.push(t1);
b[t1].push(m);
}
else if(s1[0]=='D')
{
int y=q.front();
printf("%d\n",b[y].front());
b[y].pop();
if(b[y].empty())
q.pop();
}
}
printf("\n");
}
return 0;
}
一道基础的队列练习题,比起之前的数组模拟要简单的多。