1. 程式人生 > >PAT 乙級 1003

PAT 乙級 1003

https 題解 簡單 end href case def spa 這樣的

題目

題目地址: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