您的位置:首页 > 其它

FOJ--1589--自动机--解题报告

2009-08-04 18:54 357 查看
Tom博士最近研发了一个自动机,该自动机能够同时处理n个队列。其中,队列的编号为1..n。给定m个操作,模拟该自动机的工作状态。

第一行有2个整数n,m(1≤n, m≤10,000),表示自动机能处理n个队列,接下来m行每行一条操作指令。

每条指令的格式如下:

指令指令说明
INIT将自动机初始化,此时所有的队列清空。
PUSH id val把整数val加入到编号id的队列的尾部。
POP id val输出并删除编号id的队列的队首元素,如果队列为空,则输出“NULL”。
在每条指令中,id的编号在1..n中,val的取值范围为-231~231。输入数据保证操作的第一条指令都是是INIT。

数据输入输出

本题有多组输入数据,你必须处理到EOF为止。

请对输入数据中每条POP指令的结果依次输出一行结果。

输入样例

3 12
INIT
PUSH 1 100
POP 2
PUSH 3 300
PUSH 1 200
PUSH 2 -5
POP 2
PUSH 2 -10
POP 1
INIT
PUSH 1 7
POP 1

输出样例

NULL
-5
100
7

分析:这题我是用双队列容器(deque),因为queue容器不包含清楚功能

代码如下:

#include <stdio.h>
#include <deque>
#include <string>
using namespace std;
int main()
{
deque<int> elem[10001];
int n,m,id,i,val;
char str[5];
while (scanf("%d%d",&n,&m)!=EOF)
{
while (m--)
{
scanf("%s",str);
if(strcmp(str,"INIT")==0)
{
for(i=0;i<=n;i++)
elem[i].clear();
}
else if(strcmp(str,"PUSH")==0)
{
scanf("%d%d",&id,&val);
elem[id].push_back(val);
}
else if(strcmp(str,"POP")==0)
{
scanf("%d",&id);
if(elem[id].empty())
{
printf("NULL/n");
}
else
{
printf("%d/n",elem[id].front());
elem[id].pop_front();
}
}
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: