标签:
Description
Input
Output
Sample Input
2 3 101 102 103 3 201 202 203 ENQUEUE 101 ENQUEUE 201 ENQUEUE 102 ENQUEUE 202 ENQUEUE 103 ENQUEUE 203 DEQUEUE DEQUEUE DEQUEUE DEQUEUE DEQUEUE DEQUEUE STOP 2 5 259001 259002 259003 259004 259005 6 260001 260002 260003 260004 260005 260006 ENQUEUE 259001 ENQUEUE 260001 ENQUEUE 259002 ENQUEUE 259003 ENQUEUE 259004 ENQUEUE 259005 DEQUEUE DEQUEUE ENQUEUE 260002 ENQUEUE 260003 DEQUEUE DEQUEUE DEQUEUE DEQUEUE STOP 0
Sample Output
Scenario #1 101 102 103 201 202 203 Scenario #2 259001 259002 259003 259004 259005260001
分析:
题意就是模拟食堂买饭的时候你要是发现前面有熟人就去插队这样的事 = = ,,一般的方法是链表模拟,我也试过用两个队列来做但是超时,发现别人的博客如果用优先队列的话就可以 。优先队列的思路就是自定义比较函数里面按两种方式定义优先级。 链表模拟有一个细节不注意就会RE。
代码:
#include<iostream> #include<stdlib.h> #include<cstdio> #include<cstring> #include<map> using namespace std; struct node { int val; node *next; }*last,*head; node* team[1000+5]; map<int,int>tid; int n,num; void init() { tid.clear();//num=0; head=last=(node*)malloc(sizeof(node)); //head=last=(node*)malloc(sizeof(node)); head->next=NULL; for(int i=1;i<=n;i++) team[i]=NULL; } void in() { int k; node* t; scanf("%d",&k); t=(node*)malloc(sizeof(node)); // t=&a[num++]; t->val=k;t->next=NULL; int ttid=tid[k]; if(team[ttid]==NULL) { team[ttid]=t; last->next=t; last=t; } else { node *p; p=team[ttid]; t->next=p->next; p->next=t; team[ttid]=t; if(last==p) //此处要注意,否则RE last=t; } } void out() { int k=head->next->val; int kk=tid[k]; if(head->next==team[kk]) { printf("%d\n",k); team[kk]=NULL; } else printf("%d\n",k); head=head->next; } int main() { int cas=1; while(scanf("%d",&n),n) { printf("Scenario #%d\n",cas++); init(); for(int i=1;i<=n;i++) { int k; scanf("%d",&k); for(int j=1;j<=k;j++) { int kk; scanf("%d",&kk); tid[kk]=i; } } char ss[200]; while(1) { scanf("%s",ss); if(strcmp(ss,"STOP")==0) break; else if(strcmp(ss,"ENQUEUE")==0) in(); else out(); } printf("\n"); } return 0; }
标签:
原文地址:http://blog.csdn.net/is_cp/article/details/45111809