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; }
最终测试结果