【队列】Team Queue(luogu-UVA540/poj 2259)
生活随笔
收集整理的這篇文章主要介紹了
【队列】Team Queue(luogu-UVA540/poj 2259)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Team Queue
luogu-UVA540
poj 2259
題目大意:
有n個小組的人要排隊,每個小組中有若干個人,當一個人入隊時,如果隊中有自己小組的人就跟在此人后面,否則站在隊尾,現在給出一些操作,讓你去操作,分別是:
從隊尾入隊:ENQUEUE
從對頭出隊:DEQUEUE
結束當前數據:STOP
樣例輸入
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 203Scenario #2 259001 259002 259003 259004 259005 260001數據范圍
1<=n<=10001<=n<=10001<=n<=1000
人的編號是0到999999范圍內的整數
一個團隊最多可包含1000個人
解題思路:
用n+1個隊列,有1個是存小組,其它n個是存小組內的人,當某個人入隊時,就直接進他小組的隊,如果他進來之前,小組沒人入隊,那他所在的小組入隊,取出時,也差不多,就去第一個小組里面取最前面的
代碼:
#include<queue> #include<cstdio> #include<string> #include<cstring> #include<iostream> using namespace std; int n,x,y,t,a[1000500]; string str; int main() {scanf("%d",&n);while(n){printf("Scenario #%d\n",++t);//輸出第幾組數據for (int i=1;i<=n;++i){scanf("%d",&x);for (int j=1;j<=x;++j){scanf("%d",&y);a[y]=i;//第y個人在第i小組}}queue<int>d[1001];//定義隊列cin>>str;while(str!="STOP"){if(str=="ENQUEUE")//入隊{scanf("%d",&x);if (d[a[x]].empty())//如果小組沒人,那小組進隊d[0].push(a[x]);d[a[x]].push(x);//如小組的隊}else if(str=="DEQUEUE")//查詢{x=d[0].front();//最前面的小組y=d[x].front();//最前面的人d[x].pop();if (d[x].empty())//如果小組空了那小組出隊d[0].pop();printf("%d\n",y);//輸出}cin>>str;}putchar(10);scanf("%d",&n); } }總結
以上是生活随笔為你收集整理的【队列】Team Queue(luogu-UVA540/poj 2259)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【单调栈】Largest Rectang
- 下一篇: 【树形区间DP】加分二叉树(ssl 10