PAT 乙級 1003
阿新 • • 發佈:2018-11-15
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