hdu 1387(Team Queue) STL

Team Queue

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 2051    Accepted Submission(s): 713

Problem Description

Queues and Priority Queues are data structures which are known to most computer scientists. The Team Queue, however, is not so well known, though it occurs often in everyday life. At lunch time the queue in front of the Mensa is a team queue, for example. 
In a team queue each element belongs to a team. If an element enters the queue, it first searches the queue from head to tail to check if some of its teammates (elements of the same team) are already in the queue. If yes, it enters the queue right behind them. If not, it enters the queue at the tail and becomes the new last element (bad luck). Dequeuing is done like in normal queues: elements are processed from head to tail in the order they appear in the team queue.

Your task is to write a program that simulates such a team queue.

Input

The input will contain one or more test cases. Each test case begins with the number of teams t (1<=t<=1000). Then t team descriptions follow, each one consisting of the number of elements belonging to the team and the elements themselves. Elements are integers in the range 0 - 999999. A team may consist of up to 1000 elements.

Finally, a list of commands follows. There are three different kinds of commands:

ENQUEUE x - enter element x into the team queue 
DEQUEUE - process the first element and remove it from the queue 
STOP - end of test case 
The input will be terminated by a value of 0 for t.

Output

For each test case, first print a line saying "Scenario #k", where k is the number of the test case. Then, for each DEQUEUE command, print the element which is dequeued on a single line. Print a blank line after each test case, even after the last one.

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

Source

University of Ulm Local Contest 1998

Recommend

Eddy   |   We have carefully selected several similar problems for you:  1103 1341 1308 1072 1702

排队问题,一个term为一个单位,前面如果有你的term你可以直接进term的队尾,没有你就在整个队最后,自己新建自己的term并排在队尾。相当于双重队列

开始直接用两个队列模拟过程 TLE 了,换一个做法,有两个操作:
1、进队:
  用map匹配先队列中有没有你的term,有的话在你排在 term最后,没有的话新建term,并排在整体最后;

2、出队

  直接取整体第一个term,并取出第一个人,取完后判断term是否为空,为空解散;

 1 //608MS    4544K    1051B    G++
 2 #include<iostream>
 3 #include<algorithm>
 4 #include<string.h>
 5 #include<queue>
 6 #include<map>
 7 #include<vector>
 8 using namespace std;
 9 const int N = 1005;
10 typedef queue<int> INTQ;
11
12 int main()
13 {
14     int n,m,a;
15     char op[10];
16     int cas=1;
17     while(cin>>n && n){
18         map<int ,int>TERM;
19         for(int i=1;i<=n;i++){
20             cin>>m;
21             for(int j=0;j<m;j++){
22                 cin>>a;
23                 TERM[a]=i;
24             }
25         }
26
27         INTQ V[N];
28         map<int, int>M2V;
29         int index=1;
30         int head_index=index;
31         cout<<"Scenario #"<<cas++<<endl;
32         while(cin>>op){
33             if(strcmp(op, "STOP")==0){
34                 break;
35             }
36             else if(strcmp(op, "ENQUEUE")==0){
37                 cin>>a;
38                 if(M2V[TERM[a]]==0){
39                     INTQ tQ;
40                     tQ.push(a);
41                     V[index] =  tQ;
42                     M2V[TERM[a]] = index;
43                     index = (index+1)%N;
44                 }else{
45                     V[M2V[TERM[a]]].push(a);
46                 }
47
48             }else{
49                 int a=V[head_index].front();
50                 V[head_index].pop();
51                 cout<<a<<endl;
52                 if(V[head_index].empty()){
53                     M2V[TERM[a]] = 0;
54                     head_index = (head_index+1)%N;
55                 }
56             }
57
58         }
59         cout<<endl;
60     }
61     return 0;
62 }

时间: 2024-10-24 17:11:29

hdu 1387(Team Queue) STL的相关文章

HDU 4903 (模拟+贪心)

Fighting the Landlords Problem Description Fighting the Landlords is a card game which has been a heat for years in China. The game goes with the 54 poker cards for 3 players, where the “Landlord” has 20 cards and the other two (the “Farmers”) have 1

K - Leapin&#39; Lizards - HDU 2732(最大流)

题意:在一个迷宫里面有一些蜥蜴,这个迷宫有一些柱子组成的,并且这些柱子都有一个耐久值,每当一只蜥蜴跳过耐久值就会减一,当耐久值为0的时候这个柱子就不能使用了,每个蜥蜴都有一个最大跳跃值d,现在想知道有多少蜥蜴不能离开迷宫(跳出迷宫就可以离开了.) 输入描述:输入矩阵的行M和跳跃值D,接着输入两个矩阵(列数自己求),第一个矩阵是每个柱子的耐久值,下面一个矩阵有'L'的表示这个柱子上有一只蜥蜴. 分析:题目明白还是比较容易的,矩阵的点数是20*20,也就400个点,对每个有耐久值的柱子进行拆点,然后

hdu 1011(树形dp)

Mark.看着吴神博客写的,还未完全懂. 1 #include <stdio.h> 2 #include <string.h> 3 #include <iostream> 4 #include <algorithm> 5 #include <vector> 6 #include <queue> 7 #include <set> 8 #include <map> 9 #include <string>

HDU 4035Maze(概率DP)

HDU 4035   Maze 体会到了状态转移,化简方程的重要性 题解转自http://blog.csdn.net/morgan_xww/article/details/6776947 /** dp求期望的题. 题意: 有n个房间,由n-1条隧道连通起来,实际上就形成了一棵树, 从结点1出发,开始走,在每个结点i都有3种可能: 1.被杀死,回到结点1处(概率为ki) 2.找到出口,走出迷宫 (概率为ei) 3.和该点相连有m条边,随机走一条 求:走出迷宫所要走的边数的期望值. 设 E[i]表示

HDU 2196Computer(树形DP)

给你一颗边带权值的树,求树上的每一点距离其最远的一个点的距离 比较典型的题了,主要方法是进行两次DFS,第一次DFS求出每一个点距离它的子树的最远距离和次远距离,然后第二次DFS从父节点传过来另一侧的树上的距离它的最远距离进行一次比较便可得出任意点的最远距离了 之所以需要记录最远和次远是为了辨别父节点的最远距离是否是根据自己得来,如果是的话应该选择父节点的次远距离,保证结果的准确性 1 //#pragma comment(linker,"/STACK:102400000,102400000&qu

HDU——B-number(数位DP)

题目大意: 要找出1到n之间有多少个数含13,并且能被13整除 记忆化搜索: dp[pos][pre][mod][statu],pos位数,pre前一位,mod余数,statu状态 有2个状态:含13,不含13 <span style="font-size:18px;"><strong>#include<iostream> #include<cstring> #include<cstdio> #include<algor

HDU 1254 (经典游戏)推箱子 BFS+dfs

Problem Description 推箱子是一个很经典的游戏.今天我们来玩一个简单版本.在一个M*N的房间里有一个箱子和一个搬运工,搬运工的工作就是把箱子推到指定的位置,注意,搬运工只能推箱子而不能拉箱子,因此如果箱子被推到一个角上(如图2)那么箱子就不能再被移动了,如果箱子被推到一面墙上,那么箱子只能沿着墙移动. 现在给定房间的结构,箱子的位置,搬运工的位置和箱子要被推去的位置,请你计算出搬运工至少要推动箱子多少格. Input 输入数据的第一行是一个整数T(1<=T<=20),代表测试

HDU 4864(多校)1004 Task

Problem Description Today the company has m tasks to complete. The ith task need xi minutes to complete. Meanwhile, this task has a difficulty level yi. The machine whose level below this task's level yi cannot complete this task. If the company comp

HDU 4960 (水dp)

Another OCD Patient Problem Description Xiaoji is an OCD (obsessive-compulsive disorder) patient. This morning, his children played with plasticene. They broke the plasticene into N pieces, and put them in a line. Each piece has a volume Vi. Since Xi