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:电动车通行证制度

还没有模拟出来,待续。。。

 

posted @ 2012-04-17 10:33  calmound  阅读(434)  评论(0编辑  收藏  举报