专栏首页calmoundFOJFOJ有奖月赛-2012年4月(校赛热身赛)-解题报告总结

FOJFOJ有奖月赛-2012年4月(校赛热身赛)-解题报告总结

题3:买票三人行

lzs,v11,shadow三个人一起去火车站买票,售票处有三个窗口,每个窗口都有人在排队,三个人各自独立地选择了一个窗口去排队买票,现在已知从开始售票到某一时刻,三个售票窗口队列的人员流动信息,你知道他们分别是第几个买到票的人吗?

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这样是自环,不是环)和重边,那么它就是幸运图。现在,给你一个无向图,判断它是否是幸运图。

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

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 程序员面试50题(3)—翻转句子中单词的顺序[算法]

    题目:输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。句子中单词以空格符隔开。为简单起见,标点符号和普通字母一样处理。 例如输入“I am a ...

    互联网金融打杂
  • C语言之预处理命令与用typedef命名已有类型

     预处理命令 主要是改进程序设计环境,以提高编程效率,不属于c语言本身的组成部分,不能直接对它们进行编译,必须在对 程序编译之前,先对程序中的这些特殊命令进行...

    互联网金融打杂
  • 今天研究了一下手机通信录管理系统(C语言)

    题目:手机通信录管理系统 一、题目要求 二、需求分析 三、设计步骤/编写代码 四、上机/运行结果 五、总结 一、题目要求 模拟手机通信录管理系统,实现对手机中...

    互联网金融打杂
  • C程序之修改Windows的控制台大小

    //change the console size #include <stdio.h> #include<stdlib.h> //必须有 int main(...

    互联网金融打杂
  • C/C++常用头文件及函数汇总

    C/C++头文件一览 C #include <assert.h>    //设定插入点 #include <ctype.h>     //字符处理 #inclu...

    互联网金融打杂
  • C语言之位运算

    指针和位运算很适合编写系统软件的需要。 位运算指进行二进制位的运算。   按位与”运算符 & 用途 1)清零 2)取一个数中某些指定位(比如只需要低8位) 3)...

    互联网金融打杂
  • C语言之控制台读取上下左右方向键指令

    首先,可以检测任何按键键值 // 首先,检测任何按键的代码 #include<stdio.h> #include<conio.h> int main() { ...

    互联网金融打杂
  • C语言之函数

      结构化程序设计主张按功能来分析需求,主要原则自顶向下,逐步求精,模块化等。 主张按功能把软件系统逐步细分,每个功能都负责对数据进行一次处理,每个功能接收一些...

    互联网金融打杂
  • C++之new/delete/malloc/free详解

    主要内容: 1.  C语言中的函数malloc和free 2.  C++中的运算符new和delete 3.  new/delete与malloc/free之间...

    互联网金融打杂
  • 验证 结构体指针与自增运算符

    #include <stdio.h> #include <stdlib.h> int main() { struct student { char *...

    互联网金融打杂

扫码关注云+社区

领取腾讯云代金券