poj-2259 team queue(数据结构)

第一遍看的时候立即想到了哈希表。

再想时觉得两个队列,一个用来排队伍之间的顺序,一个用来排队伍内部成员的顺序即足够了。

DEQUE的时候先判断哪只队伍排在队首,之后再让该队伍中的首队员出列。

整体没有什么难度,注意的一些小tips如下:

1、多个测试用例一定注意先初始化(因为这个wa了两次。。呃呃)

2、判断是否需要进行队伍排序可以另立一个flag数组用来标记某支队伍是否已经在队列中,若不在则插入该队伍序号。

3、别忘了按要求输出(最后空一行,否则就PE了)

ac代码如下:

#include<iostream> 
#include<cstdio> 
#include<cstdlib>
#include<queue>
#include<map>
#include<cstring>
using namespace std;
const int maxn=1005;
queue<int> pno[maxn];//各个team内部排序 
queue<int> tno;//team排序
int teamflg[maxn];
int main(void) {
    int t;
    map<int,int> pt;//队伍与人 
    int se=0;
    while(scanf("%d",&t)&&t){
        //初始化 (一开始忘了这茬,wa了两次。。。) 
        memset(teamflg,0,sizeof(teamflg));
        while(tno.empty()==0)tno.pop();
        for(int i=0;i<maxn;i++){
            if(pno[i].empty()==0){
                while(pno[i].empty()==0)pno[i].pop();
            }    
        }
        printf("Scenario #%d\n",++se);
        for(int i=0;i<t;i++){
            int num;
            cin>>num;
            for(int j=0;j<num;j++){
                int person;
                cin>>person;
                pt[person]=i;
            }
        }
        string op;
        
        while(true){
            cin>>op;
            if(op[0]=='S')break;
            else if(op[0]=='E'){
                int p;
                cin>>p;
                int team=pt[p];
                pno[team].push(p);
                if(teamflg[team]==0){
                    tno.push(team);
                    teamflg[team]=1;
                }
            }
            else if(op[0]=='D'){
                int team=tno.front();
                int out=pno[team].front();
                pno[team].pop();
                printf("%d\n",out);
                if(pno[team].empty()==1){
                    tno.pop();
                    teamflg[team]=0;
                }
            }
        }
        cout<<endl;
    }
    return 0;
}

 

posted @ 2018-04-04 21:29  KYSpring  阅读(179)  评论(0编辑  收藏  举报