PAT-乙级-1003(C++)

1003. 我要通过!(20)

时间限制

400 ms

内存限制

65536 kB

代码长度限制

8000 B

判题程序

Standard

作者

CHEN, Yue

答案正确”是自动判题系统给出的最令人欢喜的回复。本题属于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.字符串中必须仅有P, A, T这三种字符,不可以包含其它字符;

2.任意形如 xPATx 的字符串都可以获得“答案正确”,其中 x 或者是空字符串,或者是仅由字母 A 组成的字符串;

  这里要注意空字符串不是空格!!!即正确形式为PAT、APATA、AAPATAA等。P之前的A个数与T之后的A个数相等。

3. 如果 aPbTc 是正确的,那么 aPbATca 也是正确的,其中 a, b, c 均或者是空字符串,或者是仅由字母 A 组成的字符串。

  这个要求是相对而言比较有难度的,需要仔细分析,一开始拿到可能完全不理解题意。aPbATca正确的前提是aPbTc正确,那么如何保证aPbTc正确呢?

  根据之前的条件可知,能判断正确的必然只有条件二。即第一次递推时,aPbTc满足条件二,b==‘A‘,a==c;

    递推关系:

        

 

  以此类推我们可以总结出一个关系,T后面A的个数等于P前A的个数乘以P和T之间的A的个数。

  这道题不难但是条件三挺绕的emmm,我是用字符串写的调用的str.length(),网上大部分都是直接用的int去数的,本质是差不多的~

  起初是看到三个功能所以写了三个函数,后来发现函数一是不必要的就注释掉了~

 1 #include<iostream>
 2 #include<string>
 3 using namespace std;
 4 bool fun1(string m);
 5 bool fun2(string m);
 6 bool fun3(string m);
 7 int main()
 8 {
 9     int num;
10     cin >> num;
11     string a[10];
12     for (int i = 0; i < num; i++)
13         cin >> a[i];
14     for (int i = 0; i < num; i++)
15     {
16         //bool first = fun1(a[i]);
17         bool second = fun2(a[i]);
18         bool third = fun3(a[i]);
19         if ((/*first&&*/second) || (/*first&&*/third))
20             cout << "YES" << endl;
21         else
22             cout << "NO" << endl;
23     }
24 }
25 bool fun1(string m)
26 {
27     int n = m.length();
28     for (int j = 0; j < n; j++)
29     {
30         if (m[j] != ‘P‘ && m[j] != ‘A‘ && m[j] != ‘T‘)
31             return false;
32     }
33     return true;
34 }
35 bool fun2(string m)
36 {
37     int j = 0;
38     string str1, str2, str3;
39     for (; m[j] == ‘A‘; j++)
40     {
41         str1 += m[j];
42     }
43     if (m[j] != ‘P‘ || m[j + 1] != ‘A‘ || m[j + 2] != ‘T‘)
44         return false;
45     j += 3;
46     for (; m[j] == ‘A‘; j++)
47     {
48         str2 += m[j];
49     }
50     if (j != m.length())
51         return false;
52     if (str1 != str2)
53         return false;
54     return true;
55 }
56 bool fun3(string m)
57 {
58     int j = 0;
59     string str1, str2, str3;
60     for (; m[j] == ‘A‘; j++)
61     {
62         str1 += m[j];
63     }
64     if (m[j] != ‘P‘)
65         return false;
66     j += 1;
67     for (; m[j] == ‘A‘; j++)
68     {
69         str2 += m[j];
70     }
71     if (str2 == "")
72         return false;
73     if (m[j] != ‘T‘)
74         return false;
75     j += 1;
76     for (; m[j] == ‘A‘; j++)
77     {
78         str3 += m[j];
79     }
80     if (j != m.length())
81         return false;
82     if (str3.length()!=(str1.length()*str2.length()))
83         return false;
84     return true;
85 }
时间: 2024-10-28 23:41:51

PAT-乙级-1003(C++)的相关文章

PAT 乙级 1003

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

C++&#183;PAT乙级1003. 我要通过!(17/20)

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

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.

1054. 求平均值 (20)-PAT乙级真题

今天刚刚到学校,2017年学习正式开始了,今天看到了浙大的<数据结构>这学期又要开课了,决定一定要跟着学习一遍:在大学生mooc网上学习:http://www.icourse163.org/course/zju-93001#/info :然后就是跟着<算法之美>也要同步看完. 然后就在PAT上随便做一道题,这是第一次通过AC,发现了两个比较好的博客主页:http://www.liuchuo.net/  和  https://www.joyhwong.com/   都总结了刷题的过程

PAT乙级1034. 有理数四则运算(20)

本题要求编写程序,计算2个有理数的和.差.积.商. 输入格式: 输入在一行中按照“a1/b1 a2/b2”的格式给出两个分数形式的有理数,其中分子和分母全是整型范围内的整数,负号只可能出现在分子前,分母不为0. 输出格式: 分别在4行中按照“有理数1 运算符 有理数2 = 结果”的格式顺序输出2个有理数的和.差.积.商.注意输出的每个有理数必须是该有理数的最简形式“k a/b”,其中k是整数部分,a/b是最简分数部分:若为负数,则须加括号:若除法分母为0,则输出“Inf”.题目保证正确的输出中没

PAT乙级1006题python3代码

PAT乙级1006题python3代码 目录 PAT乙级1006题python3代码 目录 代码 题目: 让我们用字母B来表示"百".字母S表示"十",用"12-n"来表示个位数字n(<10),换个格式来输出任一个不超过3位的正整数.例如234应该被输出为BBSSS1234,因为它有2个"百".3个"十".以及个位的4. 输入格式:每个测试输入包含1个测试用例,给出正整数n(<1000). 输出

PAT 乙级 1045

题目 题目地址:PAT 乙级 1045 题解 本题的解法比较巧妙,刚开始的试着用暴力求解,果不其然时间超限-- 变换思路,既然对于每个元素来说满足的条件是前小后大,那么对数组排序,对应的位置相等的即为题设要求的"可能主元",但是还有一个条件要保证当前是从左向右遍历的最大值:总结一下两个条件:1. 排序后对应位置数字相等:2. 当前操作元素是从左向右遍历中的最大值 同时还要注意,当输入n值为0时,除了需要输出"可能主元"的个数之外,还需要保留换行符'\n' 代码 1

PAT 乙级 1017

题目 题目地址:PAT 乙级 1017 题解 粗看是一道大数除法题,实际上只不过是通过字符数组模拟除法过程,理解之后还是比较简单的: 具体分析一下本题: 因为题设中的除数(n)是一位整数,因此大幅简化了整个运算过程:在整个运算中最为重要的就是中间变量(sum),判断中间变量sum是否足够大能被除数n整除,这也是本题的关键所在: 通过是否判断sum是否能被整除,可以分为以下两种情况: 1. sum == 0 && num[i] < n (当前运算位num[i]小于除数) 2. 其余情况