洛谷P2776 [SDOI2007]小組佇列題解
阿新 • • 發佈:2021-06-18
對於新手難度適宜的一個數據結構題
題面簡述
將一個佇列分為若干個組,組內的成員入隊時直接插入到小組後面,隊內無小組成員時插入到隊尾。
有兩種操作:\(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; }
完結撒花 (。・∀・)ノ花花花