PAT 乙级 1003

Posted moujun1001

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PAT 乙级 1003相关的知识,希望对你有一定的参考价值。

题目

    题目地址:PAT 乙级 1003

 

题解

    规律观察题,本题的关键在于把题读懂,同时还有几个比较容易疏忽的地方需要注意;总之这道题要考虑的东西更多,细节上也要特别注意;

    规律:“如果 aPbTc 是正确的,那么 aPbATca 也是正确的”,这是理解本题的关键信息,观察之后会发现,当b的字符串里再增加一个A,那么T之后的字符串就会多出a个A(特别注意,这里的 ‘ca’ 实际上是 c + a 个A字符的关系),那么这个关系也就显而易见了,只有在 a * b = c 的条件下,才会有这样的结果,我们再来简单推导一下:

            设  a * b = c

            由题设条件可知:a * (b + 1) = c + a,再次说明,ca表明有c + a个A

            将上式分配可得:a * b + a = c + a…………(1)

            又  a * b = c

            则 (1) 式成立

    通过以上分析可知,本题的字符中的关系就是:a * b = c

    在分析完本题最重要的条件之后,还需要在代码过程中注意几点问题;需要说明的是,题目条件中三个条件是层层递进的关系,也就是说只有满足之前的条件才能判断之后的条件

    从以上先决条件推导可得如下两个需要注意的问题:

          1. 字符 P 和 T 在一个字符串中只能出现一次;

          2. P 和 T 之间必须有字符 A;

    因为没有完全理解之前那句话,结果导致没有一次AC(-_-||)

 

代码

 1 #include <iostream>
 2 #include <string>
 3 using namespace std;
 4 
 5 int main() {
 6     string str;
 7     int n = 0;
 8     int cnta = 0, cntb = 0, cntc = 0;
 9     bool flagp = false, flagt = false, flaga = false, flagx = false;
10     cin >> n;
11     for (int i = 0; i < n; i++) {
12         cin >> str;
13         for (int j = 0; j < str.size(); j++) {
14             switch (str[j]) {
15                 case A:
16                     flaga = true;
17                     if (!flagp && !flagt) cnta++;
18                     else if (flagp && !flagt) cntb++;
19                     else if (flagp && flagt) cntc ++;
20                     break;
21                 case P:
22                     if (flagp)
23                         flagx = true;
24                     else
25                         flagp = true;
26                     break;
27                 case T:
28                     if (flagt)
29                         flagx = true;
30                     else
31                         flagt = true;
32                     break;
33                 default:
34                     flagx = true;
35                     break;
36             }
37             if (flagx) break;
38         }
39         if (flagx)
40             cout << "NO" << endl;
41         else if (flagp && flagt && flaga && cntb != 0 && cnta * cntb == cntc)
42             cout << "YES" << endl;
43         else
44             cout << "NO" << endl;
45         cnta = cntb = cntc = 0;
46         flagp = flagt = flaga = flagx = false;
47     }
48 
49     return 0;
50 }

 

以上是关于PAT 乙级 1003的主要内容,如果未能解决你的问题,请参考以下文章

PAT 乙级 1003

PAT乙级1003

PAT乙级1003

PAT乙级算法 1003 我要通过!

[PAT乙级] Practise 1003 我要通过!

PAT乙级.1003.我要通过