uva540-小团体队列

小白书里数据结构基础线性表的训练参考

题目链接 http://acm.hust.edu.cn/vjudge/problem/19518

解题思路

用到队列。大队列表示团体顺序,小队列表示团体内部顺序。

题目提示入队出队要常数时间。。。

于是用到两个映射

  成员映射到团体序号。只需开个数组存每个成员的团体编号。

  团体映射大队列里的编号。又要开个数组。最多有1000个团体,还好。。。

读入数据的时候记得忽略空格。

代码

#include<iostream>
#include<fstream>
#include<stdio.h>
#include<string.h>
#include<queue>
using namespace std;
const int MAX_LEN = 1005;
queue<int> Q[MAX_LEN];
int where[MAX_LEN];
int team[1000000];
int front, rear;
void enqueue(int index)
{
    int i = where[team[index]];
    if(i == -1) {
        rear = (rear+1)%MAX_LEN;
        i = rear;
    }
    Q[i].push(index);
    where[team[index]] = i;
}
void dequeue()
{
    int temp;
    temp = Q[(front+1)%MAX_LEN].front();
    cout << temp << endl;
    Q[(front+1)%MAX_LEN].pop();
    if(Q[(front+1)%MAX_LEN].empty()) {
        where[team[temp]] = -1;
        front = (front+1)%MAX_LEN;
    }
}
void Print(int now)
{
    cout << "Scenario #" << now << endl;
}
int main()
{
    int t, now = 1;
    cin >> t;
    front = rear = MAX_LEN-1;
    while(t != 0) {
        memset(where, -1, sizeof(where));
        for(int i=0; i<t; i++) {
            int n;
            cin >> n;
            for(int j=0; j<n; j++) {
                int number;
                cin >> number;
                team[number] = i;
            }
        }
        char c;
        while(c=getchar()!=‘\n‘) ;
        Print(now);
        char s[20];
        gets(s);
        while(strstr(s, "STOP") == NULL) {
            if(strstr(s, "ENQUEUE") != NULL) {
                int index;
                sscanf(s, "ENQUEUE %d", &index);
                enqueue(index);
            }
            else dequeue();
            gets(s);
        }
        now++;
        cout << endl;
        cin >> t;
        for(int i=0; i<MAX_LEN; i++) while(!Q[i].empty()) Q[i].pop();
        front = rear = MAX_LEN-1;
    }
}
时间: 2024-08-05 20:36:20

uva540-小团体队列的相关文章

UVa 540 小团体队列

题意:队列中有小团体(队列).当入队时,如果有该团体的元素在队列中,则新元素排到该团体的尾部,否则排到队列的尾部.出队时和正常的一样,队首元素出列. 思路:这个用STL很好模拟,用纯C的话,很直接会想到用二维数组来做,每个团体是其中的一个一维数组,最多再开一个数组来对小团体编号进行排队.但是当时没有看到题目中说的每个团体最后有1000个元素,这样的话我以为要开1000X200000的数组,忒大了~ 然后用的链表来实现.这里仍然是避免了指针和动态分配内存等易出错的东西,(不过这个方法还是把自己弄晕

对于公司中的小团体该怎么处理?

在很多公司中,都会存在一些小的团体,他们或以相同的兴趣或者住在一起而聚集再一起,对于不同阶段的公司,这些小团体,对于公司都是有一些影响.很多公司比较支持员工以兴趣为方向组成兴趣小组,然后开展相关的一些活动.增进员工之间的了解.但是更多的公司是比较忌惮公司内部的一些小团体,特别是涉及利益而促成的一些小团体.那么从公司的角度来看,对于这些小团体有什么影响. 首页积极的一面.公司内存存在的一些小的以兴趣为方向而形成的一些小团体.增加了公司的凝聚性,增进了公司员工之间的了解,对于工作的开展提供了较多的方

UVa 540 (团体队列) Team Queue

题意: 每个人都属于一个团体,在排队的时候,如果他所在的团体有人在队伍中,则他会站到这个团体的最后.否则站到整个队伍的队尾. 输出每次出队的人的编号. 分析: 容易看出,长队中,在同一个团体的人是排在一起的. 所以用两个队列模拟即可,一个队列保留团体的编号,另外一个队列数组存放的是团体中每个人的编号. 1 #include <cstdio> 2 #include <queue> 3 #include <map> 4 using namespace std; 5 6 co

5_6 团体队列(UVa540)&lt;queue与STL其他容器的综合运用&gt;

先给出T个团体,并给出每个团体有多少人和每个人的编号,然后所有团体一起排队,排成一条大队列,排队的原则是,一个成员加入,如果这个成员所在的团体已经有人在排队了,那么他就加到他所在团体的最后面,而不是整个大队列的最后.如果整个大队列中没有他的团体,也就是他是他的那个团体第一个来的人,那么他就要排在整个大队列的最后(当然,他成为了他这个团体的第一人,以后他的队友来了就可以排他后面) [输入] 输入文件将包含一个或多个测试案例.每个测试案例第一个是团队T的数量.然后,接下来的T行为团队每个人的编号,编

算法入门经典-第五章 例题5-6 团体队列

题目背景 队列和优先级队列是大多数计算机科学家都知道的数据结构.但是团队队列却不被人熟知,尽管在生活中经常出现.比如,午餐时间的食堂门口的队列就是一个团队队列.在一个团队队列中,每个元素属于一个团队.如果一个元素进入一个队列,它首先从头到尾地搜寻这个队列--检查是否它的队友(在同一个团队称之为队友)也在这个队列里.如果有,它就排在它队友的后面(:-D就是插队咯~~).如果没有,它就排在整个队列的最后,成为新的最后一名(/(ㄒoㄒ)/~真是不幸).在普通队列中出队是这样的:元素从头到尾的被处理,按

小代码 队列

//最近喜欢上了队列. //几个代码中均运用到了队列. // #include<iostream> #include<queue>    #include <vector>   #include <list>   #include <math.h>  #include <cstdio>  using namespace std; int  main() { int n=4; cin>>n; int m=pow(2,n)-1

例题5-6 团体队列 Team Queue UVA - 540

还好吧,刚开始没想明白用什么数据结构来做,后来才想到用一个队列和一个队列数组,一个存当前队伍的排队队列,另一个存每个在排队的队伍内部的人员队列.其他的set什么的,都不是最重要的内容了. 卡了我三个点: 1.忘了控制空队出队,空队排头了,导致了RE一次.在写了判定条件之后RE没了,成了WA-_- 2.这次WA是因为没有及时清除中间变量.是比较隐含的中间变量,表示某个队伍是否已在总队伍中的set,我在某只队伍最后一个成员从总队伍中出队后,没有清楚set中这支队伍的标记.也就是说,这支队伍其实不存在

小管理 大智慧

五天假期过去了,短短的开学两三天,与五天的清闲相比,遇到的事情真的不是多一点啊,好多次都是连水都顾不上喝一口,大脑一直处于饱和状态. 这样的忙碌固然充实,但是忙碌之后更加发觉:很多事情的处理效率很低. 一.邮件管理 背景1: 部分同学在学术交流中心住宿,开学的时候需要通过邮件,来明确注意事项.邮箱的联系人中创建有小班长的分组,所以我一直以 学术交流中心负责人-->CEO-->小班长-->所有组员,这样的方式下发邮件.晓春组没有住在学术交流中心的同学,但是我前几次发邮件的时候都未经筛选,顺

bzoj 1314: River过河 树套树+单调队列

Description ZY带N个小Kid过河,小KID分成两种:高一年级,高二年级,由于存在代沟问题,如果同一条船上高一年级生和高二年级生数量之差超过K,就会发生不和谐的事件.当然如果一条船上全是同一年级的,就绝对不会发生争执.现在ZY按小KID队列的顺序依次安排上船,并且不能让他们在过河时发生争执.对于当前等待上船的小KID来说,要么让他上船,要么将停在渡口的船开走,再让他上另一条船,同一条船上的人不过超过M人.为了让所有的小KID过河,在知悉小KID队列的情况下,最少需要多少条船. Inp