首页 > 代码库 > 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
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。