• PAT (Basic Level) Practise


    答案正确”是自动判题系统给出的最令人欢喜的回复。本题属于PAT的“答案正确”大派送 —— 只要读入的字符串满足下列条件,系统就输出“答案正确”,否则输出“答案错误”。

    得到“答案正确”的条件是:

    1. 字符串中必须仅有P, A, T这三种字符,不可以包含其它字符;
    2. 任意形如 xPATx 的字符串都可以获得“答案正确”,其中 x 或者是空字符串,或者是仅由字母 A 组成的字符串;
    3. 如果 aPbTc 是正确的,那么 aPbATca 也是正确的,其中 a, b, c 均或者是空字符串,或者是仅由字母 A 组成的字符串。

    现在就请你为PAT写一个自动裁判程序,判定哪些字符串是可以获得“答案正确”的。

    输入格式: 每个测试输入包含1个测试用例。第1行给出一个自然数n (<10),是需要检测的字符串个数。接下来每个字符串占一行,字符串长度不超过100,且不包含空格。

    输出格式:每个字符串的检测结果占一行,如果该字符串可以获得“答案正确”,则输出YES,否则输出NO。

    输入样例:

    8
    PAT
    PAAT
    AAPATAA
    AAPAATAAAA
    xPATx
    PT
    Whatever
    APAAATAA
    

    输出样例:

    YES
    YES
    YES
    YES
    NO
    NO
    NO
    NO
    

     解题思路:

    第二条和第三条规则总结出来就是: P之前的A数目乘以P与T之间的A的数目等于P后面的A的数目。

    对于第2个规则:x*1=x。对于第3个规则:aPbTc如果正确,那么b一定是A、a=c,bA就是AA,a*2=aa=ca。

    C/C++版代码:

    #include<cstdio>
    #include<iostream>
    #include<cstring>
    using namespace std;
    int main()
    {
        int n;
        char c[100];
        int count_P, count_T, count_A, pos_T, pos_P;
        scanf("%d", &n);
        getchar(); //接收换行符,或者将上句话写成这样 scanf("%d
    ", &n);
    
        for(; n--; )
        {
            gets(c);
            count_P = count_A = count_T = 0;
            pos_P = pos_T = 0;
            for(int i=0; i<strlen(c); i++)
            {
                if(c[i] == 'P')
                {
                    count_P++;
                    pos_P = i;
                    continue;
                }
                if(c[i] == 'A')
                {
                    count_A++;
                    continue;
                }
                if(c[i] == 'T')
                {
                    count_T++;
                    pos_T = i;
                    continue;
                }
            }
    
            if(count_A+count_P+count_T!=strlen(c) || count_P!=1 ||count_T!=1 ||
                pos_T<=pos_P+1 || pos_P*(pos_T-pos_P-1)!=strlen(c)-pos_T-1)
                    printf("NO
    ");
            else
                printf("YES
    ");
        }
        return 0;
    }

    解释一下代码中if语句的结果判定条件:

    count_A+count_P+count_T!=strlen(c)   显然这是为了满足第一条规则
    count_P!=1
    count_T!=1      我们可以从题目中看出P和T仅出现一次
    pos_T<=pos_P+1   这个条件是为了满足第二条规则, 保证T一定在P后面,且它们中间至少有一个A,,其他任意
    pos_P*(pos_T-pos_P-1)!=strlen(c)-pos_T-1)   这是为了满足第三条规则,P之前的A数目乘以P与T之间的A的数目等于P后面的A的数目,看不懂的话自己举个例子就可以推出来了


    题目链接:https://www.patest.cn/contests/pat-b-practise/1003
    参考链接:http://blog.csdn.net/acm_ted/article/details/19835069
         http://blog.csdn.net/wyxdexyq/article/details/23255135

     
  • 相关阅读:
    XMLHttpRequest 跨域问题
    jQuery+AJAX实现纯js分页功能
    PHP验证码
    PHP基础
    UIView易忽略点
    UITableView  优化
    SpringBoard界面层级结构分析
    给App在“设置”中添加选项(类似招行App)
    通过USB线SSH登陆到越狱手机上(命令行模式的),不通过wifi
    在IOS项目中使用Lua
  • 原文地址:https://www.cnblogs.com/tanrong/p/8506966.html
Copyright © 2020-2023  润新知