【POJ 2259】 Team Queue

【题目链接】

http://poj.org/problem?id=2259

【算法】

由题,一个人入队时,若这个人所在的组已经有人在队列中,则加入队列,否则排到队末

因此我们发现,这个队列一定是由连续的一组人的若干段组成,不妨用一个队列记录每组人的顺序,再分别将每组建一个队列

维护这(n+1)个队列即可,具体细节,笔者不再赘述

【代码】

#include <algorithm>
#include <bitset>
#include <cctype>
#include <cerrno>
#include <clocale>
#include <cmath>
#include <complex>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <ctime>
#include <deque>
#include <exception>
#include <fstream>
#include <functional>
#include <limits>
#include <list>
#include <map>
#include <iomanip>
#include <ios>
#include <iosfwd>
#include <iostream>
#include <istream>
#include <ostream>
#include <queue>
#include <set>
#include <sstream>
#include <stdexcept>
#include <streambuf>
#include <string>
#include <utility>
#include <vector>
#include <cwchar>
#include <cwctype>
#include <stack>
#include <limits.h>
using namespace std;
#define MAXN 1010
#define MAXS 1000010

int i,n,s,x,pos,TC;
int g[MAXS];
bool inq[MAXN];
char opt[10];
queue< int > ord;
queue< int > q[MAXN];

int main()
{

        while (scanf("%d",&n) != EOF && n)
        {
                memset(inq,false,sizeof(inq));
                while (!ord.empty()) ord.pop();
                for (i = 1; i <= n; i++)
                {
                        while (!q[i].empty())
                                q[i].pop();
                }
                for (i = 1; i <= n; i++)
                {
                        scanf("%d",&s);
                        while (s--)
                        {
                                scanf("%d",&x);
                                g[x] = i;
                        }
                }
                printf("Scenario #%d\n",++TC);
                while (true)
                {
                        scanf("%s",&opt);
                        if (opt[0] == ‘S‘) break;
                        if (opt[0] == ‘E‘)
                        {
                                scanf("%d",&x);
                                if (inq[g[x]]) q[g[x]].push(x);
                                else
                                {
                                        inq[g[x]] = true;
                                        ord.push(g[x]);
                                        q[g[x]].push(x);
                                }
                        }
                        if (opt[0] == ‘D‘)
                        {
                                pos = ord.front();
                                printf("%d\n",q[pos].front());
                                q[pos].pop();
                                if (q[pos].empty())
                                {
                                        ord.pop();
                                        inq[pos] = false;
                                }
                        }
                }
                printf("\n");
        }

        return 0;

}

原文地址:https://www.cnblogs.com/evenbao/p/9245664.html

时间: 2024-10-06 18:59:21

【POJ 2259】 Team Queue的相关文章

【UVa 540】Team Queue

  Team Queue  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

【POJ 1112】Team Them Up!(二分图染色+DP)

Description Your task is to divide a number of persons into two teams, in such a way, that: everyone belongs to one of the teams; every team has at least one member; every person in the team knows every other person in his team; teams are as close in

【POJ 3071】 Football(DP)

[POJ 3071] Football(DP) Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 4350   Accepted: 2222 Description Consider a single-elimination football tournament involving 2n teams, denoted 1, 2, -, 2n. In each round of the tournament, all tea

【POJ 2513】Colored Sticks

[POJ 2513]Colored Sticks 并查集+字典树+欧拉通路 第一次做这么混的题..太混了-- 不过题不算难 字典树用来查字符串对应图中的点 每个单词做一个点(包括重复单词 题意就是每个边走且直走一次(欧拉通路 欧拉图的判定: 没有或者只有两个奇数度的点的图叫做欧拉图 有这些就可以解答此题了 另外需要注意题目范围是25W个木棍 所以最多可能有50W个点 卡了好多个RE 代码如下: #include <iostream> #include <cstdlib> #incl

【POJ 1201】 Intervals(差分约束系统)

[POJ 1201] Intervals(差分约束系统) 11 1716的升级版 把原本固定的边权改为不固定. Intervals Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 23817   Accepted: 9023 Description You are given n closed, integer intervals [ai, bi] and n integers c1, ..., cn. Write a p

【POJ 2750】 Potted Flower(线段树套dp)

[POJ 2750] Potted Flower(线段树套dp) Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 4566   Accepted: 1739 Description The little cat takes over the management of a new park. There is a large circular statue in the center of the park, surrou

【POJ 1442】 Black Box

[POJ 1442] Black Box 向一个恒递增序列中加数 一开始序列为空 不断加m个数 有n个询问 x1x2x3-xi每次个询问表示加第x个数后 第i小的数是几 两个优先队列进行维护 一个递增一个递减 令递增队列对首为当前第i小的数 因此递减队列需要存i前的数 每当序列需要加一个数时 先与递减队列比较 如果比递减队列队首(前i-1个数中最大的数)小 将该数入递减队列 把递减队列对首拿出加入递增队列 此时递增队列队首即为当前第i小的数 如果比递减队列队首大 直接加入递增队列 递增队列对首为

【POJ 2442】Sequence

[POJ 2442]Sequence 优先队列 m个序列 每个序列n个数 从每个序列中取一个数 可以组成一个长为m的序列 这样一共有n^m种组法 把所有组合的加和排序后输出前n小的和 乍一看听高深的一个问题 其实想清楚了很简单 每一组中取一个数相加 第一组可以有n种取法 假设当前只有两组 按题意组合就是将第一组中n个数分别与第二组n个数相加 取出前n小的和 那么现在再来一组 前两组一共有n*n种组合 每种组合与第三组中n个数再组合 前n小的和就是结果 这三组一共有n^3种组合 然而答案只需要前n

【POJ 3259】Wormholes

[POJ 3259]Wormholes 判断负环--BellMan/SPFA 代码如下 BellMan-Ford #include <cstdio> #include <cstring> #define INF 0x3f3f3f3f using namespace std; typedef struct Edge { int u,v,w; }Edge; Edge eg[5555]; int dis[555],n,tp; bool BellMan() { memset(dis,INF