1. 程式人生 > 其它 >洛谷P2776 [SDOI2007]小組佇列題解

洛谷P2776 [SDOI2007]小組佇列題解

題目傳送門

對於新手難度適宜的一個數據結構題

題面簡述

將一個佇列分為若干個組,組內的成員入隊時直接插入到小組後面,隊內無小組成員時插入到隊尾。

有兩種操作:\(push\)\(pop\)(具體操作和佇列一樣,是針對大佇列的)

思路

模擬

程式碼思路簡述

用大陣列儲存每個元素的組別。

用若干個小佇列和一個大佇列來模擬:

大佇列存放小組的排名,小組沒人就彈出隊首小組;

每個小佇列放組員順序,在壓入組員時,直接壓入在對應小組的佇列後面,彈出直接彈出隊首組員。

程式碼

#include<iostream>
#include<queue>
using namespace std;
queue<int> q[305];//各個小組
int b[100005];//組員所在的組
queue<int> all;//大隊
int main()
{
    int n,m;
    cin>>n>>m;
    for(int i=0;i<n;i++)
        cin>>b[i];
    int t;
    cin>>t;
    while(t--)
    {
        string temp;
        cin>>temp;
        if(temp=="pop")
        {
            cout<<q[all.front()].front()<<endl;//輸出小組的隊首
            q[all.front()].pop();//彈出小組隊首
			if(q[all.front()].empty())
                all.pop();//小組沒人了就在大隊中將小組彈出
        }
        else
        {
            int x;
            cin>>x;
            if(q[b[x]].empty())
                all.push(b[x]);//如果大隊中沒有所在小組就連同小組排在隊尾
            q[b[x]].push(x);//在小組中壓入組員
        }
    }
    return 0;
}

完結撒花 (。・∀・)ノ花花花