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;
}
posted @ 2020-07-17 17:50  shuitiangong  阅读(120)  评论(0编辑  收藏  举报