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 }