首页 > 代码库 > UVa 540 小团体队列
UVa 540 小团体队列
题意:队列中有小团体(队列)。当入队时,如果有该团体的元素在队列中,则新元素排到该团体的尾部,否则排到队列的尾部。出队时和正常的一样,队首元素出列。
思路:这个用STL很好模拟,用纯C的话,很直接会想到用二维数组来做,每个团体是其中的一个一维数组,最多再开一个数组来对小团体编号进行排队。但是当时没有看到题目中说的每个团体最后有1000个元素,这样的话我以为要开1000X200000的数组,忒大了~
然后用的链表来实现。这里仍然是避免了指针和动态分配内存等易出错的东西,(不过这个方法还是把自己弄晕了点~)用大数组来模拟。首先申请的MAXN个Node的数组anode即是这里最后会用到的Node数,cnt来计数。然后team数组是保存元素i的团体编号team[i],iindex数组是保存每个团体i在队列中最后一个元素的anode下标。然后front和rear指向这个逻辑上的队列的队首和队尾元素。每次入队出队时维护上述信息即可。调了几次才调通,总是会忽略一些情况,注释里有。
注意:index是string.h中的一个函数,在本地可通过,交到OJ上就CE了。所以改成了iindex。
开始以为输入数据是给了类别编号,看第一个示例,有两个3号类,就不能理解了。问了才发现那个3是该类个数,不是类别编号。所以,要看清题目,及题目要求,特别是对样例困惑的时候。
遇到WA时,可以构造大一点的数据来测试。(比如开始把cnt当rear指针用,很多示例都过得了,多测几种数据才发现错误)
Code:
#include<stdio.h> #include<string.h> #define MAXN 200010 struct Node { int data; int next; }; Node anode[MAXN]; int team[1000010];//相当于hash表,元素i在team[i]团体里 int cnt=0;//anode数组使用最大的计数,anode[0]不用,作为空元素 int iindex[1010];//每个小团体在队列中尾元素的anode数组编号 //int que[MAXN];//题中描述的队列,入队的是在anode数组编号 int front=1,rear=0;//终指向团体队列的队首,队尾。注意这里rear不能用cnt代替,两者不同 int main() { //freopen("540.in","r",stdin); //freopen("540.out","w",stdout); int t; int n=1; while((scanf("%d",&t)==1)&&t) { printf("Scenario #%d\n",n++); memset(iindex,0,sizeof(iindex)); memset(team,0,sizeof(team)); cnt=0;front=1; for(int i=0;i<t;++i) { int num=0,a=0; scanf("%d",&num); for(int j=0;j<num;++j) { scanf("%d",&a); team[a]=i; } } //input command char cmd[25]; while(scanf("%s",cmd)==1) { if(cmd[0]=='E') { int b=0; scanf("%d",&b); anode[++cnt].data=http://www.mamicode.com/b;>UVa 540 小团体队列
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。