C++·PAT乙级1003. 我要通过!(17/20)

/*
1003. 我要通过!(20)

“答案正确”是自动判题系统给出的最令人欢喜的回复。本题属于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

*/
/*
    思路:
        方法1:规则制约法
                复杂度:O(n)
        方法2:递归
                O(n^2)
*/
#include<stdio.h>
#include <string.h>
using namespace std;

const int MAX_LENGTH = 100;

//判断是否满足条件1:1. 字符串中必须仅有P, A, T这三种字符,不可以包含其它字符;
bool isPATChars(char chs[], int len){
    for(int i=0;i<len;i++){
        if(chs[i] != ‘P‘ && chs[i] != ‘A‘ && chs[i] != ‘T‘)
            return 0;
    }
    return 1;
}

bool isPAT(char chs[], int len){
    if(len < 3)
        return false;
    int p_flag=-1;//标记P位置
    int t_flag=-1;//标记T位置
    int a_count=0; //统计中间a的个数:若中间a的个数为1-2个,正确;反之,不正确
    for(int i=0;i<len;i++){
        if(chs[i] == ‘A‘){
            if(p_flag != -1){
                if(t_flag == -1){
                    a_count++;
                }
            }
        } else if(chs[i] == ‘P‘){
            if(p_flag == -1){//说明:找到第1个字符‘P‘
                p_flag = i;
            } else {//说明有超过1个字符‘P‘了
                return false;
            }

        } else {//当前元素为 ‘T‘
            if(t_flag == -1){//说明:找到第1个字符‘T‘
                if(p_flag == -1){ //说明: 此时出现的‘T‘比‘P‘先出现,错误情况
                    return false;
                }
                t_flag = i; //出现的第一个在‘P‘后面的 ‘T’
            } else {//说明有超过1个字符‘T‘了
                return false;
            }

            if(p_flag != -1){//说明:‘P‘在‘T‘之前出现了,正确情况
                if(p_flag == i - 1){ //说明:‘P‘与‘T‘紧贴着,中间没有‘A‘ 错误情况
                    return false;
                }
            } else {//说明:‘P‘在‘T‘之前出现了,错误情况
                return false;
            }
        }
    }

    if(p_flag == -1 || t_flag == -1 || a_count>2 || a_count<1)//保证PAT均有出现
        return false;
    return true;
}

int main(){
    int size;
    char chs_arr[10][MAX_LENGTH];

    scanf("%d", &size);

    for(int i=0;i<size;i++){
        scanf("%s", (chs_arr+i));
    }

    for(int i=0;i<size;i++){
        //scanf("%s", (chs_arr+i));
        //printf("%d", strlen(chs_arr[i]));
        if(isPATChars(chs_arr[i], strlen(chs_arr[i]))){
            if(isPAT(chs_arr[i], strlen(chs_arr[i]))){
                printf("YES\n");
            } else {
                printf("NO\n");
            }
        } else {
            printf("NO\n");
        }
    }
    return 0;
}

  

原文地址:https://www.cnblogs.com/johnnyzen/p/8799221.html

时间: 2025-01-09 23:21:48

C++·PAT乙级1003. 我要通过!(17/20)的相关文章

PAT 乙级 1003

题目 题目地址:PAT 乙级 1003 题解 规律观察题,本题的关键在于把题读懂,同时还有几个比较容易疏忽的地方需要注意:总之这道题要考虑的东西更多,细节上也要特别注意: 规律:"如果 aPbTc 是正确的,那么 aPbATca 也是正确的",这是理解本题的关键信息,观察之后会发现,当b的字符串里再增加一个A,那么T之后的字符串就会多出a个A(特别注意,这里的 'ca' 实际上是 c + a 个A字符的关系),那么这个关系也就显而易见了,只有在 a * b = c 的条件下,才会有这样

PAT乙级:1053 住房空置率 (20分)

PAT乙级:1053 住房空置率 (20分) 题干 在不打扰居民的前提下,统计住房空置率的一种方法是根据每户用电量的连续变化规律进行判断.判断方法如下: 在观察期内,若存在超过一半的日子用电量低于某给定的阈值 e,则该住房为"可能空置": 若观察期超过某给定阈值 D 天,且满足上一个条件,则该住房为"空置". 现给定某居民区的住户用电量数据,请你统计"可能空置"的比率和"空置"比率,即以上两种状态的住房占居民区住房总套数的百分

PAT乙级.1003.我要通过

"答案正确"是自动判题系统给出的最令人欢喜的回复.本题属于PAT的"答案正确"大派送 -- 只要读入的字符串满足下列条件,系统就输出"答案正确",否则输出"答案错误". 得到"答案正确"的条件是: 1. 字符串中必须仅有P, A, T这三种字符,不可以包含其它字符: 2. 任意形如 xPATx 的字符串都可以获得"答案正确",其中 x 或者是空字符串,或者是仅由字母 A 组成的字符串:

PAT乙级 1003. 我要通过!

题目: "答案正确"是自动判题系统给出的最令人欢喜的回复.本题属于PAT的"答案正确"大派送 -- 只要读入的字符串满足下列条件,系统就输出"答案正确",否则输出"答案错误". 得到"答案正确"的条件是: 1. 字符串中必须仅有P, A, T这三种字符,不可以包含其它字符: 2. 任意形如 xPATx 的字符串都可以获得"答案正确",其中 x 或者是空字符串,或者是仅由字母 A 组成的字

PAT乙级1003

19分,有点没懂题目意思,隔段时间再回来看看. import java.util.Scanner; public class Main { public static void main(String[] args){ Scanner scanner = new Scanner(System.in); int n = scanner.nextInt(); scanner.nextLine(); for(int i = 0 ; i < n ; ++i){ String str = scanner.

PAT 乙级 1074 宇宙无敌加法器 (20 分)

1074 宇宙无敌加法器 (20 分) 地球人习惯使用十进制数,并且默认一个数字的每一位都是十进制的.而在 PAT 星人开挂的世界里,每个数字的每一位都是不同进制的,这种神奇的数字称为"PAT数".每个 PAT 星人都必须熟记各位数字的进制表,例如"--0527"就表示最低位是 7 进制数.第 2 位是 2 进制数.第 3 位是 5 进制数.第 4 位是 10 进制数,等等.每一位的进制 d 或者是 0(表示十进制).或者是 [2,9] 区间内的整数.理论上这个进制

PAT 乙级 1049 数列的片段和(20) C++版

1049. 数列的片段和(20) 时间限制 200 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CAO, Peng 给定一个正数数列,我们可以从中截取任意的连续的几个数,称为片段.例如,给定数列{0.1, 0.2, 0.3, 0.4},我们有(0.1) (0.1, 0.2) (0.1, 0.2, 0.3) (0.1, 0.2, 0.3, 0.4) (0.2) (0.2, 0.3) (0.2, 0.3, 0.4) (0.3) (0.3, 0.4)

PAT乙级真题1004. 成绩排名 (20)(解题)

题目: 读入n名学生的姓名.学号.成绩,分别输出成绩最高和成绩最低学生的姓名和学号. 输入格式:每个测试输入包含1个测试用例,格式为 第1行:正整数n 第2行:第1个学生的姓名 学号 成绩 第3行:第2个学生的姓名 学号 成绩 ... ... ... 第n+1行:第n个学生的姓名 学号 成绩 其中姓名和学号均为不超过10个字符的字符串,成绩为0到100之间的一个整数,这里保证在一组测试用例中没有两个学生的成绩是相同的. 输出格式:对每个测试用例输出2行,第1行是成绩最高学生的姓名和学号,第2行是

PAT 乙级 水题 1004. 成绩排名 (20)

  时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 读入n名学生的姓名.学号.成绩,分别输出成绩最高和成绩最低学生的姓名和学号. 输入格式:每个测试输入包含1个测试用例,格式为 第1行:正整数n 第2行:第1个学生的姓名 学号 成绩 第3行:第2个学生的姓名 学号 成绩 ... ... ... 第n+1行:第n个学生的姓名 学号 成绩 其中姓名和学号均为不超过10个字符的字符串,成绩为0到100之间的一个整数,