题目原网址:http://poj.org/problem?id=2259

题目中文翻译:

Description

队列和优先级队列是大多数计算机科学家已知的数据结构。 然而,Team Queue并不是很知名,尽管它常常发生在日常生活中。 例如,在午餐时间,门萨前面的队列就是Team Queue。

在Team Queue中,每个元素都属于一个团队。 如果一个元素进入队列,它首先从头到尾搜索队列,以检查它的一些队友(同一队的元素)是否已经在队列中。 如果是,它会进入Team Queue后面。 如果不是,它会从尾部进入队列并成为新的最后一个元素(运气不好)。 出队是在常规队列中完成的:元素按照出现在队列中的顺序从头到尾进行处理。

你的任务是编写一个模拟这样的Team Queue的程序。

Input

输入将包含一个或多个测试用例。 每个测试用例都以团队的数量t开始(1 <= t <= 1000)。 然后是团队描述,每个描述包含属于团队的元素数量和元素本身。 元素是0到999999之间的整数。一个团队最多可以包含1000个元素。

最后,下面是一系列命令。 有三种不同的命令:

ENQUEUE x - 在队列中输入元素x

DEQUEUE - 处理第一个元素并将其从队列中移除

STOP - 测试用例结束

输入将以t的值0结束。

注意:一个测试用例最多可以包含200000个(20万个)命令,所以团队队列的实现应该是高效的:一个元素的入队和出队只需要一定的时间。

Output

对于每个测试用例,首先打印一行表示“Scenario #k”的行,其中k是测试用例的编号。 然后,对于每个DEQUEUE命令,将出队元素打印单独一行上。 在每个测试用例之后打印一行空白行,即使是在最后一行之后。

Sample Input

2

3 101 102 103

3 201 202 203

ENQUEUE 101

ENQUEUE 201

ENQUEUE 102

ENQUEUE 202

ENQUEUE 103

ENQUEUE 203

DEQUEUE

DEQUEUE

DEQUEUE

DEQUEUE

DEQUEUE

DEQUEUE

STOP

2

5 259001 259002 259003 259004 259005

6 260001 260002 260003 260004 260005 260006

ENQUEUE 259001

ENQUEUE 260001

ENQUEUE 259002

ENQUEUE 259003

ENQUEUE 259004

ENQUEUE 259005

DEQUEUE

DEQUEUE

ENQUEUE 260002

ENQUEUE 260003

DEQUEUE

DEQUEUE

DEQUEUE

DEQUEUE

STOP

0

Sample Output

Scenario #1

101

102

103

201

202

203

Scenario #2

259001

259002

259003

259004

259005

260001

解题思路:

看题目,如果我们按照题目,用一个队列来维护整个Team Queue,用STL则无法实现,而手写也不是非常容易实现.所以,我们要想一个更简单的办法:

既然题目说这里面有许多不同的团队,那么我们为什么不用一个大的队列只记录团队号的顺序,再用一些小的队列来记录每个团队内元素的先后顺序.

每当读入元素,我们判断它所在的团队是否在大序列中,如果在,则直接将这个元素插入到它的团队队列中;如果不在,则将它的团队号插入到大队列中,再将它插入到它的团队队列中.

每当要输出元素,便找大队列中最前面的团队的第一个元素,弹出,如果这个团队的序列空了,则将这个团队的团队号从大队列中弹出去.

AC代码:

 #include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
#include<string> using namespace std; int n;
queue<int > uo;
int op = ;
int kk[];//记录每个元素是哪个团队的 struct kkk{//表示每个团队
queue<int > qq;//小队列
bool vis;//表示这个团队是否在大队列中
}e[]; void work(int oo) {//解题过程
cout << "Scenario #" << oo << endl;
string l;
while(cin >> l && l != "STOP") {
if(l == "ENQUEUE") {
int p;
cin >> p;
e[kk[p]].qq.push(p);
if(e[kk[p]].vis == ) {
uo.push(kk[p]);
e[kk[p]].vis = ;
}
}
if(l == "DEQUEUE") {
cout << e[uo.front()].qq.front() << endl;
e[uo.front()].qq.pop();
if(e[uo.front()].qq.empty()) {
e[uo.front()].vis = ;
uo.pop();
}
}
if(l == "STOP") break;
}
} void chus() {//初始化
memset(kk,,sizeof(kk));
while(!uo.empty()) uo.pop();
for(int i = ;i <= n; i++) {
while(!e[i].qq.empty())
e[i].qq.pop();
e[i].vis = ;
}
} int main() {
while(cin >> n && n != ) {
chus();
for(int i = ;i <= n; i++) {
int k,l;
scanf("%d",&k);
for(int j = ;j <= k; j++) {
scanf("%d",&l);
kk[l] = i;
}
}
work(op);
cout << endl;
op++;
}
return ;
}

POJ 2259 Team Queue(队列)的更多相关文章

  1. POJ 2259 - Team Queue - [队列的邻接表]

    题目链接:http://poj.org/problem?id=2259 Queues and Priority Queues are data structures which are known t ...

  2. (队列的应用5.3.2)POJ 2259 Team Queue(队列数组的使用)

    /* * POJ_2259.cpp * * Created on: 2013年10月30日 * Author: Administrator */ #include <iostream> # ...

  3. poj 2259 Team Queue

    Team Queue Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 2977   Accepted: 1092 Descri ...

  4. queue POJ 2259 Team Queue

    题目传送门 题意:先给出一些小组成员,然后开始排队.若前面的人中有相同小组的人的话,直接插队排在同小组的最后一个,否则只能排在最后面.现在有排队和出队的操作. 分析:这题关键是将队列按照组数分组,用另 ...

  5. UVA.540 Team Queue (队列)

    UVA.540 Team Queue (队列) 题意分析 有t个团队正在排队,每次来一个新人的时候,他可以插入到他最后一个队友的身后,如果没有他的队友,那么他只能插入到队伍的最后.题目中包含以下操作: ...

  6. 团体队列UVA540 Team Queue(队列简单用法)

    题目背景 队列和优先级队列是大多数计算机科学家都知道的数据结构.但是团队队列却不被人熟知,尽管在生活中经常出现.比如,午餐时间的食堂门口的队列就是一个团队队列.在一个团队队列中,每个元素属于一个团队. ...

  7. [POJ2259]Team Queue (队列,模拟)

    2559是栈,2259是队列,真的是巧啊 题意 模拟队列 思路 水题 代码 因为太水,不想打,发博客只是为了与2559照应,于是附上lyd的std #include <queue> #in ...

  8. POJ 3125 Printer Queue(队列,水题)

    题意:有多组数据,每组数据给出n,m,n表示需要打印的文件个数,m表示要打印的目标位置(m为0~n-1).    接下来给出n个数,第i个值对应第i-1个位置的优先级大小.    打印规则如下:    ...

  9. Team Queue POJ - 2259 (队列)

    Queues and Priority Queues are data structures which are known to most computer scientists. The Team ...

随机推荐

  1. maven之基础

    一.配置maven的环境 下载地址:http://maven.apache.org/download.cgi(window下载(Binary zip)的) 将maven解压,然后配置环境变量打开: 计 ...

  2. Java课堂测试--实现ATM的基本操作体会

    9月20的周四的Java课堂第一节课上就是有关于实现ATM的考试内容,在实现的过程中我了解到自己本身还是有很多的不足之处,例如在实现工程方面的相似性上面还有些许就的欠缺,再者就是回宿舍拿电源的原因导致 ...

  3. Google的Guava类库简介(转)

    说明:信息虽然有点旧,至少可以先了解个大概. Guava是一个Google的基于Java的类库集合的扩展项目,包括collections, caching, primitives support, c ...

  4. 生产环境之Nginx高可用方案

    准备工作: 192.168.16.128 192.168.16.129 两台虚拟机.安装好Nginx 安装Nginx 更新yum源文件: rpm -ivh http://nginx.org/packa ...

  5. VB6 如何连接MYSQL数据库

    1 从官网下载MYSQL的ODBC,选择与自己操作系统对应的版本(前提是你安装了MYSQL) http://dev.mysql.com/downloads/connector/odbc/   2 安装 ...

  6. vue 手风琴组件

    1.创建组件 SqueezeBox.vue <!-- 手风琴(三级折叠列表) 组件 --> <template> <div class="header" ...

  7. ART虚拟机之Trace原理(转)

    一.概述 Android 6.0系统采用的art虚拟机,所有的Java进程都运行在art之上,当应用发生ANR(Application Not Response,其中最终的一个环节便是向目标进程发送信 ...

  8. 浅谈c#的三个高级参数ref out 和Params C#中is与as的区别分析 “登陆”与“登录”有何区别 经典SQL语句大全(绝对的经典)

    浅谈c#的三个高级参数ref out 和Params   c#的三个高级参数ref out 和Params 前言:在我们学习c#基础的时候,我们会学习到c#的三个高级的参数,分别是out .ref 和 ...

  9. Java面试通关要点汇总整理【终极版】(转载)

    简历篇 请自我介绍 请介绍项目 基础篇 基本功 面向对象的特征 final, finally, finalize 的区别 int 和 Integer 有什么区别 重载和重写的区别 抽象类和接口有什么区 ...

  10. c++学习笔记之基础---类内声明线程函数的调用

    近日需要将线程池封装成C++类,类名为Threadpool.在类的成员函数exec_task中调用pthread_create去启动线程执行例程thread_rounter.编译之后报错如下: spf ...