说说:
今天感觉状态不是很好,眼睛有点痛,诶~但是题目都解得不错诶。两道比较繁琐的题目都写得异常顺利。先说说这道题的题意吧。首先题目给你几组数据,然后给你一些命令,你按照命令进行操作。ENQUEUE x,将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; }
原文地址:http://blog.csdn.net/u011915301/article/details/39120509