题目的意思大概就是现在让你做一个数据结构,具体的应该是一个队列,有一堆元素,这堆元素拥有两个特性,一是它的值,二是它所在的team值。这个队列满足以下的一些性质(操作)。
ENQUEUE(k) : 将元素k插入队列,如果队列中有跟元素k一个team的,则自动插到那个元素的后面,否则插至队列尾。
DEQUEUE:弹出队首元素,并且输出
STOP:停止所有操作
本题我的大致思路就是用二维队列,队列里套队列,我们很容易知道这个队列满足一个特性就是抱团性,一个team的都在一起,那么用二维数组的思想可以直接给他们一个特定的下标来约束这个team,然后至于这个team内部怎么排,那是这个team自己的事了,对于每个team建立一个普通的queue来维护它,那么输出时是先按大顺序后小顺序弹出就行了
#include <cstdio> #include <cstring> #include <iostream>#define MAXN 1010using 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; }
最终测试结果