思路: list+map模擬
分析:
1 題目的意思是有n個隊伍,每個隊伍的人數為m。
2 現在有三種操作,ENQUEUE x是插入x,如果隊列裡面已經有x這一隊的成員那麼直接插入到這一隊的最後一個,否則插入到隊列的最後一個;DEQUEUE 是直接拿到隊列的第一個元素輸出,並刪除隊列的第一個元素;STOP是停止
3 直接利用map和list來模擬,由於題目要求要插入的具體的位置所以用list來模擬
代碼:
#include<map>
#include<list>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int MAXN = 1010;
map<int , int>mp;
list<int>ls;
list<int>:: iterator it[MAXN];
int cnt[MAXN];
void insert(int x){
if(ls.size() == 0){
ls.push_back(x);
it[mp[x]] = ls.begin();
return;
}
int tmp = mp[x];
if(it[tmp] == ls.end()){
ls.push_back(x);
it[tmp] = ls.end();
it[tmp]--;
}
else{
list<int>:: iterator tmpIt = it[tmp];
ls.insert(++tmpIt , x);
it[tmp]++;
}
}
int main(){
int n , m , x;
int Case = 1;
char str[20];
while(scanf("%d" , &n) && n){
mp.clear();
ls.clear();
for(int i = 1 ; i < MAXN ; i++)
it[i] = ls.end();
memset(cnt , 0 , sizeof(cnt));
printf("Scenario #%d\n" , Case++);
for(int i = 1 ; i <= n ; i++){
scanf("%d" , &m);
while(m--){
scanf("%d" , &x);
mp[x] = i;
}
}
while(scanf("%s" , str) && str[0] != 'S'){
if(str[0] == 'E'){
scanf("%d" , &x);
insert(x);
cnt[mp[x]]++;
}
else{
int front = ls.front();
ls.pop_front();
int tmp = mp[front];
printf("%d\n" , front);
cnt[tmp]--;
if(cnt[tmp] == 0)
it[tmp] = ls.end();
}
}
puts("");
}
return 0;
}