Uva 540 Team Queue

来源:互联网 发布:整型变量的数据范围 编辑:程序博客网 时间:2024/05/01 02:18

      这道题水过,直接开个二维数组,然后模拟Team Queue!这道题还可以改进一下,就是用数组模拟一个循环链表,不过貌似有点麻烦。

     下面是代码:

     

#include<stdio.h>#include<string.h>#define MAXN 5005int Q[MAXN][1005];int hash[1000000];int n,m,flag;int last=1003,num=1004;void enqueue(int x){    int i,j;    int tag=0;    for(i=1;;i++)//找到x要插入的team    {        if(hash[x]==Q[i][0]&&Q[i][num]!=0)        {            tag=1;            break;        }        if(Q[i][0]==-1) break;    }    if(tag)//如果x能够插队    {        ++Q[i][last];        Q[i][Q[i][last]]=x;        ++Q[i][num];    }    else//x不能插队    {        Q[i][1]=x;        Q[i][0]=hash[x];        Q[i][last]=Q[i][num]=1;    }}void dequeue(){    for(int j=1;;j++)    {        if(Q[flag][j]!=-1)        {            printf("%d\n",Q[flag][j]);            Q[flag][j]=-1;            --Q[flag][num];            if(Q[flag][num]==0) ++flag;            return;        }    }}int main(){    int T=0;    while(scanf("%d",&n),n)    {        ++T;        for(int i=0;i<n;i++)        {            scanf("%d",&m);            int t;            for(int j=0;j<m;j++)            {                scanf("%d",&t);                hash[t]=i;            }        }        memset(Q,-1,sizeof(Q));        printf("Scenario #%d\n",T);        char s[10];        flag=1;        while(scanf("%s",s)&&s[0]!='S')        {            if(s[0]=='E')            {                int x;                scanf("%d",&x);                enqueue(x);            }            if(s[0]=='D') dequeue();        }        printf("\n");    }    return 0;}