POJ - 2259 Team Queue (佇列)
阿新 • • 發佈:2020-08-09
題目連結
https://vjudge.net/problem/POJ-2259
題解
在任何時刻,同一個小組的人只要來到了隊伍,就會站在一起,所以我們建立一個佇列q0儲存隊伍中所有小組的編號,再為每個小組i建立一個佇列qi儲存隊伍中這個小組的所有成員,一共n+1個佇列。
當一個編號為X,組號為Y的人來到隊伍時,我們直接把X插入到qY的隊尾,。如果在插入之前qY是空的,則還要把Y插入到q0末尾,表明隊伍最後出現了一個新的小組。
當接受出隊指令時,我們通過q0得知排在最前邊的小組組號為Y,然後再把qY的隊頭出隊。出隊後qY為空,就從q0開頭刪除Y,表明這個小組目前所有人都離開。
這道題是多組輸入,如果佇列定義的是全域性變數,每次都要把佇列清空,c++的queue沒有清空佇列的函式,需要自己手動清空。 或者定義成區域性變數就不用清空了。
#include<bits/stdc++.h> using namespace std; int id[1000010]; queue<int>Q, q[1010]; int main() { //freopen("in.txt", "r", stdin); ios::sync_with_stdio(false), cin.tie(0); int n, k = 0; while (1) { int m, x; Q = queue<int>();//初始化 cin >> n; if (!n)break; for (int i = 1; i <= n; ++i) { cin >> m; for (int j = 1; j <= m; ++j) cin >> x, id[x] = i; q[i] = queue<int>(); } printf("Scenario #%d\n", ++k); string s; while (1) { cin >> s; if (s[0] == 'S')break; if (s[0] == 'E') { cin >> x; if (!q[id[x]].size())Q.push(id[x]); q[id[x]].push(x); } else if (s[0] == 'D') { int idd = Q.front(); printf("%d\n", q[idd].front()); q[idd].pop(); if (q[idd].empty())Q.pop(); } } printf("\n"); } }