FOJFOJ有奖月赛-2012年4月(校赛热身赛)-解题报告总结
题3:买票三人行
lzs,v11,shadow三个人一起去火车站买票,售票处有三个窗口,每个窗口都有人在排队,三个人各自独立地选择了一个窗口去排队买票,现在已知从开始售票到某一时刻,三个售票窗口队列的人员流动信息,你知道他们分别是第几个买到票的人吗?
View Code
View Code /* 2 测试组数 6 n行 0 IN lzs 表示第几个队列来人了 1 IN v11 2 IN shadow 0 OUT 若该对头有人则他买到票,否则忽略该信息 1 OUT 2 OUT 7 0 IN v11 2 OUT 2 IN shadow 1 IN ks 0 OUT 1 OUT 由于不是那三人之一,所以他只记住买票的次序其他忽略 2 OUT */ #include<stdio.h> #include<iostream> #include<queue> #include<string> #include<string.h> using namespace std; struct List { int x; char ch[5]; char name[10]; }list[50010]; int main() { queue<string>Q_0; queue<string>Q_1; queue<string>Q_2; int T,n,i; int tes=1; scanf("%d",&T); while(T--) { int cas=1; int rem[5]; scanf("%d",&n); printf("Case %d:\n",tes++); memset(rem,0,sizeof(rem)); for (i=0;i<n;i++) { scanf("%d%s",&list[i].x,list[i].ch);//OUT只有两个输入,所以得判断IN后在输入name if(!strcmp(list[i].ch,"IN")) { scanf("%s",list[i].name); if(list[i].x==0) Q_0.push(list[i].name); else if(list[i].x==1) Q_1.push(list[i].name); else if(list[i].x==2) Q_2.push(list[i].name); } else if(!strcmp(list[i].ch,"OUT")) { if(list[i].x==0) {//当队列为空就忽略 if(!Q_0.empty()) { if(Q_0.front()=="lzs") { rem[0]=cas;//0只记录lzs,1只记录v11,2只记录shadow } else if(Q_0.front()=="v11") { rem[1]=cas; } else if(Q_0.front()=="shadow") { rem[2]=cas; } Q_0.pop(); cas++; } } else if(list[i].x==1) { if(!Q_1.empty()) { if(Q_1.front()=="lzs") { rem[0]=cas; } else if(Q_1.front()=="v11") { rem[1]=cas; } else if(Q_1.front()=="shadow") { rem[2]=cas; } Q_1.pop(); cas++; } } else if(list[i].x==2) { if(!Q_2.empty()) { if(Q_2.front()=="lzs")//三个if主要是排除不是这三人之一的人 { rem[0]=cas; } else if(Q_2.front()=="v11") { rem[1]=cas; } else if(Q_2.front()=="shadow") { rem[2]=cas; } Q_2.pop();//排出买到票的人,因为可能不是lzs,v11,shadow三人之一 cas++; } } } } printf("lzs:"); if(rem[0]!=0) printf("%d\n",rem[0]); else printf("Unknown\n"); printf("v11:"); if(rem[1]!=0) printf("%d\n",rem[1]); else printf("Unknown\n"); printf("shadow:"); if(rem[2]!=0) printf("%d\n",rem[2]); else printf("Unknown\n"); while(!Q_0.empty()) Q_0.pop();//清空队列**很重要 while(!Q_1.empty()) Q_1.pop();//队列非空会记录上一次测试数据的结果 while(!Q_2.empty()) Q_2.pop();//导致下一次的测试运行包含上一次的内容 } return 0; }
题7:幸运图
我们认为,如果一个无向图不存在自环(1和1这样是自环,不是环)和重边,那么它就是幸运图。现在,给你一个无向图,判断它是否是幸运图。
View Code
#include<stdio.h> #include<string.h> int edge[1010][1010]; int main() { int n,m,i; int a,b; int flag; while(scanf("%d%d",&n,&m)!=EOF) { flag=0; memset(edge,0,sizeof(edge)); for (i=0;i<m;i++) { scanf("%d%d",&a,&b); if(a==b) //是否自环 { flag=1; } else if(a>b) { int t=a; a=b; b=t; } edge[a][b]++; if(edge[a][b]==2) flag=1;//判断是否重边 } if(flag) printf("No\n"); else printf("Yes\n"); } return 0; }
题6:电动车通行证制度
还没有模拟出来,待续。。。