uva540
?題目的意思大概就是現(xiàn)在讓你做一個數(shù)據(jù)結(jié)構(gòu),具體的應(yīng)該是一個隊列,有一堆元素,這堆元素?fù)碛袃蓚€特性,一是它的值,二是它所在的team值。這個隊列滿足以下的一些性質(zhì)(操作)。
? ? ?ENQUEUE(k) : 將元素k插入隊列,如果隊列中有跟元素k一個team的,則自動插到那個元素的后面,否則插至隊列尾。
? ? ?DEQUEUE:彈出隊首元素,并且輸出
? ? ?STOP:停止所有操作
? ? ?本題我的大致思路就是用二維隊列,隊列里套隊列,我們很容易知道這個隊列滿足一個特性就是抱團(tuán)性,一個team的都在一起,那么用二維數(shù)組的思想可以直接給他們一個特定的下標(biāo)來約束這個team,然后至于這個team內(nèi)部怎么排,那是這個team自己的事了,對于每個team建立一個普通的queue來維護(hù)它,那么輸出時是先按大順序后小順序彈出就行了
?
#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; }? ?最終測試結(jié)果
? ?
轉(zhuǎn)載于:https://www.cnblogs.com/Wiki-ki/archive/2012/07/14/2591373.html
總結(jié)
- 上一篇: SQL Server中行列转换 Pivo
- 下一篇: 在OEL5上安装配置Oracle Gir