1. 程式人生 > 實用技巧 >POJ 2259 Team Queue(佇列)

POJ 2259 Team Queue(佇列)

題目連結

解題思路

  這個題顯然是用佇列做的,但是單純的一維佇列無法解決這個問題,因為要涉及到插隊問題,所以我們要用一個二維的佇列來儲存完成入隊和出隊操作,但是這樣的話,我們無法得知每個隊伍的先後順序,所以我們還需要再用一個一維佇列來儲存小隊的順序。

程式碼

const int maxn = 1e3+10;
const int maxm = 1e6+10;
int id[maxm];
int main() {
    int t, kase = 1;
    while(~scanf("%d",&t) && t) {
        printf("Scenario #%d\n",kase++);
        queue<int> team, mr[maxn];
        int teamid = 0;
        while(t--) {
            ++teamid;
            int n; scanf("%d",&n);
            for (int i = 0,num; i<n; ++i)  {
                scanf("%d",&num);
                id[num] = teamid;
            }
        }
        char str[10];
        while(~scanf("%s",str) && str[0]!='S') {
            if (str[0]=='E') {
                int num; scanf("%d",&num);
                if (mr[id[num]].empty()) {
                    team.push(id[num]);
                    mr[id[num]].push(num);
                }
                else mr[id[num]].push(num);
            }
            else if (str[0]=='D') {
                printf("%d\n", mr[team.front()].front());
                mr[team.front()].pop();
                if (mr[team.front()].empty()) team.pop();
            }
        }
        putchar(endl);
    }
    return 0;
}