Wiki_ki

导航

uva540

   题目的意思大概就是现在让你做一个数据结构,具体的应该是一个队列,有一堆元素,这堆元素拥有两个特性,一是它的值,二是它所在的team值。这个队列满足以下的一些性质(操作)。

     ENQUEUE(k) : 将元素k插入队列,如果队列中有跟元素k一个team的,则自动插到那个元素的后面,否则插至队列尾。

     DEQUEUE:弹出队首元素,并且输出

     STOP:停止所有操作

     本题我的大致思路就是用二维队列,队列里套队列,我们很容易知道这个队列满足一个特性就是抱团性,一个team的都在一起,那么用二维数组的思想可以直接给他们一个特定的下标来约束这个team,然后至于这个team内部怎么排,那是这个team自己的事了,对于每个team建立一个普通的queue来维护它,那么输出时是先按大顺序后小顺序弹出就行了

  

#include <cstdio>
#include <cstring>
#include <iostream>

#define MAXN 1010

using namespace std;
struct Queue {
    int f , r;
    int ele[MAXN];
}que[MAXN];
int T , n , front , rear , Case = 0;
int h[MAXN*MAXN];
int line[MAXN];

void    init() {
    Case ++;
    cout << "Scenario #" << Case << endl;
    memset(h,0,sizeof(h));
    memset(que,0,sizeof(que));
    memset(line,-1,sizeof(line));
}

void    enqueue(int num) {
    if (line[h[num]] < 0) {
        line[h[num]] = rear;
        que[rear].ele[que[rear++].r++] = num;
        if (rear > T) rear = rear % T;
    }
    else que[line[h[num]]].ele[que[line[h[num]]].r++] = num;
}

void    dequeue() {
    cout << que[front].ele[que[front].f++] << endl;
    if (que[front].f == que[front].r) {
        line[h[que[front].ele[que[front].f-1]]] = -1;
        que[front].f = que[front].r = 0;
        memset(que[front].ele,0,sizeof(que[front].ele));
        front ++;
        if (front > T) front = front % T;
    }
}
            

int main () {
    string str;
    while (cin >> T) {
        if (!T) break; 
        init();
        int k;
        front = rear = 0;
        for (int i = 0;i < T;i++) {
            cin >> n;
            for (int j = 0;j < n;j++) {
                cin >> k;
                h[k] = i;
            }
        }
        while (cin >> str && str != "STOP") {
            if (str == "ENQUEUE") {
                cin >> k;
                enqueue(k);
            }
            else dequeue();
        }
        cout << endl;
    }
    return 0;
}

   最终测试结果

   

posted on 2012-07-14 12:06  Wiki_ki  阅读(182)  评论(0编辑  收藏  举报