首页 > 代码库 > Team Queue UVA 540

Team Queue UVA 540

说说:

今天感觉状态不是很好,眼睛有点痛,诶~但是题目都解得不错诶。两道比较繁琐的题目都写得异常顺利。先说说这道题的题意吧。首先题目给你几组数据,然后给你一些命令,你按照命令进行操作。ENQUEUEx,将x插入队列中,如果队列中存在于x同组的数,那么将x插入到该组数的最后,否则将x插入到最后。DEQUEUE,将队首输出。其实解这道题的难点在于数据结构的构造。我的解法是,先设置一个数组pos[MAX],记录某个数据所在的组序号。然后是一个二元数组queue[MAXN][MAXN],每一维都代表了队列中同组的元素。当然还需要一个beg标记起始组,end标记结束的组。在每一维之中,如queue[beg][0]表示的是起始组的序号,queue[beg][1]表示的是该组中起始元素的位置,queue[beg][2]则是该组最后一个元素的后一个位置。当插入元素时,先按照组序号从queue[beg][0]匹配到queue[end-1][0],成功,则插入插入到queue[x][end]。否则将queue[end]初始化,并将新元素插入。出队的话,只要将queue[beg][queue[1]]弹出即可,当然当一个维度中queue[beg][1]和queue[beg][2]相等时,说明该组的元素全部出队了,这时就要将beg加1了。具体的解答,见源代码吧!

源代码:

#include <stdio.h>
#include <string.h>
#define MAXN 2000+5
#define MAX 1000000+5

int queue[MAXN][MAXN];
int pos[MAX];//记录元素的组序号

int main(){
  int t,num,i,j,p,beg,end,val,flag;
  char s[10];
  int Scenario=1;
//  freopen("data","r",stdin);
  while(scanf("%d",&t)&&t){
   printf("Scenario #%d\n",Scenario++);

   memset(pos,0,sizeof(pos));
   beg=end=0;
   for(i=1;i<=t;i++){
     scanf("%d",&num);
     for(j=0;j<num;j++){
      scanf("%d",&p);
      pos[p]=i;
     }
   }
   
   while(scanf("%s",s)&&strcmp(s,"STOP")!=0){
     scanf("%d",&val);
     if(strcmp(s,"ENQUEUE")==0){
      flag=1;
      for(i=beg;i<end;i++)
        if(pos[val]==queue[i][0]){//如果同组元素在队列中已存在
          queue[i][queue[i][2]++]=val;
          flag=0;
	  break;
	}
      if(flag){//否则插入到队尾
       queue[end][0]=pos[val];//存储组序号
       queue[end][1]=3;//同组元素的起始位置
       queue[end][2]=4;//同组元素的结束位置的后一位置
       queue[end++][3]=val;
      }
     }
     else {
       printf("%d\n",queue[beg][queue[beg][1]++]);
       if(queue[beg][1]==queue[beg][2])//若该组元素已全部出列
         beg++;
     }
   }
   putchar('\n');
  }

  return 0;
}


Team Queue UVA 540