ZeroJudge E564: Team Queue

同題:UVa 00540 – Team Queue

「Queues」和「Priority Queues」是大部份的人都知道的資料結構。
然而,儘管「Team Queue」在日常生活中經常發生,但並不是眾所周知。
在「Team Queue」中,每個元素都屬於一個 Team。如果某個元素進入 Queue,它將首先從頭到尾搜索 Queue,以檢查其 teammates (同一 Team 的元素) 是否已經在 Queue 中。
如果是,它將排在其Team的最後一個。如果不是,它將排在 Queue 最後面。
Dequeuing 的方式與普通 Queue 中一樣:元素按照在 Team Queue 中出現的順序從頭到尾進行處理。
您的任務是寫一個程式模擬 Team Queue

範例測資

範例輸入範例輸出
EOF 輸入,每組測資第一行為一個整數 T (1 ≤ T ≤ 1000),T 代表有幾個 Team。
如果 T = 0 代表輸入結束。
接下來 T 行,每行第一個整數 N (1 ≤ N ≤ 1000),代表該 Team 的成員數量。
之後跟著 N 個整數 Xi (0 ≤ Xi ≤ 999999)。
接下來為若干個指令,以下為指令列表:
ENQUEUE X: 若 X 所屬的團隊成員已在Queue內,就排進 Team 內的最後一個。若沒有,則排進 Queue 的最後一個。
DEQUEUE: 將Queue 最前面的元素移除,並輸出此元素。
STOP: 結束。
注意:實現的 Team Queue 需有效率,元素的 Enqueing 和 Dequeuing 都應僅花費恆定的時間。
對於每組測資,輸出「Scenario #k」,其中 k 是測資的編號。
接著對於每個「DEQUEUE」指令,將已出 Queue 的元素輸出。
每組測資之後皆要輸出空白行
2
3 101 102 103
3 201 202 203
ENQUEUE 101
ENQUEUE 201
ENQUEUE 102
ENQUEUE 202
ENQUEUE 103
ENQUEUE 203
DEQUEUE
DEQUEUE
DEQUEUE
DEQUEUE
DEQUEUE
DEQUEUE
STOP
2
5 259001 259002 259003 259004 259005
6 260001 260002 260003 260004 260005 260006
ENQUEUE 259001
ENQUEUE 260001
ENQUEUE 259002
ENQUEUE 259003
ENQUEUE 259004
ENQUEUE 259005
DEQUEUE
DEQUEUE
ENQUEUE 260002
ENQUEUE 260003
DEQUEUE
DEQUEUE
DEQUEUE
DEQUEUE
STOP
0
Scenario #1
101
102
103
201
202
203
Scenario #2
259001
259002
259003
259004
259005
260001
ZeroJudge E564 範例測資

解題思路

宣告一個 map<string, int> 來存每一個編號的隊伍是哪個,Team Queue 可以使用一個二維陣列來實現。

需要宣告一個 map<int, int> 來存目前每一個隊伍在二維陣列中的位置,如果進行 ENQUEUE 的時候該隊伍的值為 0,則將一個新的一維陣列包含字串 Push_Back 到二維陣列中,並且將該隊伍的 map 值設定為二維陣列的大小也就是最後面。

進行 DEQUEUE 時就將二維陣列的 [0][0] 輸出並且將其刪除,每次刪除都要判斷第一個一維陣列還有沒有資料,如果沒有的話就將這個一維陣列刪除,並且要更新 Map 中的所有資料,可以使用 for(auto it:Map) 來更新資料。如果 it.second == 1 就代表這是剛剛刪掉的一維陣列,將其設為 0,如果不是 1 也不是 0 就將 Map 值 -1。

範例程式碼-ZeroJudge E564: Team Queue

#include <iostream>
#include <map>
#include <vector>
using namespace std;

int main() {
    cin.sync_with_stdio(0);
    cin.tie(0);
    int T, count = 1;
    while (cin >> T && T != 0) {
        map<string, int>MAP;
        for (int i = 0; i<T; i++) {
            int N;
            cin >> N;
            for (int j = 0; j<N; j++) {
                string str;
                cin >> str;
                MAP[str] = i;
            }
        }
        string str;
        vector<vector<string>>v;
        map<int, int>hi;
        cout << "Scenario #" << count << "\n";
        count++;
        while (cin >> str && str != "STOP") {
            if (str == "ENQUEUE") {
                string s;
                cin >> s;
                int index = hi[MAP[s]];
                if (index == 0) {
                    vector<string>tmp;
                    tmp.push_back(s);
                    v.push_back(tmp);
                    hi[MAP[s]] = v.size();
                }
                else v[index-1].push_back(s);
                continue;
            }
            cout << v[0][0] << "\n";
            v[0].erase(v[0].begin());
            if (v[0].empty()) {
                v.erase(v.begin());
                for (auto it:hi) {
                    if (it.second == 1) hi[it.first] = 0;
                    else if (it.second != 0) hi[it.first]--;
                }
            }
        }
        cout << "\n";
    }
}

//ZeroJudge E564
//Dr. SeanXD

發佈留言