PTA1003 我要通過! (20 分)
阿新 • • 發佈:2022-03-16
PTA1003 我要通過! (20 分)
“答案正確”是自動判題系統給出的最令人歡喜的回覆。本題屬於 PAT 的“答案正確”大派送 —— 只要讀入的字串滿足下列條件,系統就輸出“答案正確”,否則輸出“答案錯誤”。
得到“答案正確”的條件是:
- 字串中必須僅有
P
、A
、T
這三種字元,不可以包含其它字元; - 任意形如
xPATx
的字串都可以獲得“答案正確”,其中x
或者是空字串,或者是僅由字母A
組成的字串; - 如果
aPbTc
是正確的,那麼aPbATca
也是正確的,其中a
、b
、c
均或者是空字串,或者是僅由字母A
組成的字串。
現在就請你為 PAT 寫一個自動裁判程式,判定哪些字串是可以獲得“答案正確
輸入格式:
每個測試輸入包含 1 個測試用例。第 1 行給出一個正整數 n (≤10),是需要檢測的字串個數。接下來每個字串佔一行,字串長度不超過 100,且不包含空格。
輸出格式:
每個字串的檢測結果佔一行,如果該字串可以獲得“答案正確”,則輸出 YES
,否則輸出 NO
。
輸入樣例:
10
PAT
PAAT
AAPATAA
AAPAATAAAA
xPATx
PT
Whatever
APAAATAA
APT
APATTAA
輸出樣例:
YES
YES
YES
YES
NO
NO
NO
NO
NO
NO
演算法實現:
#include<bits/stdc++.h> using namespace std; int main(){ int n,ps=0,ts=0,p,t,i; cin>>n; string s; while(n){ n--,ps=0,ts=0,p=0,t=2; cin>>s; int ls = s.length(); for(i=0;i<ls;i++){ if(s[i]=='P'||s[i]=='A'||s[i]=='T'){ //尋找P的位置 if(s[i]=='P'){ ps++;//統計P的個數 p=i; } //尋找T的位置 if(s[i]=='T'){ ts++;//統計T的個數 t=i; } }else{ cout<<"NO"<<endl; break; } } if(i==ls){ //T在P之前,T在P緊鄰的下一位,P的數量大於1,T的數量大於1都不符合要求 if(t<p||t==(p+1)||ps!=1||ts!=1){ cout<<"NO"<<endl; }else{ if( (p*(t-1-p)) == (ls-1-t) ){ cout<<"YES"<<endl; }else{ cout<<"NO"<<endl; } } } } return 0; }
思路:
其實本題較難懂的是題意,特別是第三點條件,後來看了別人的思路,才明白題目的意思,第三點的意思是:以P和T為界,P之前的A的個數為n1,P和T之間的A的個數為n2,T之後的A的個數為n3,要滿足的條件是n1*n2=n3。主要就是這一點比較坑,其他按意思來就行,本題最主要就是確定P和T的位置,當然也要保證P和T的個數有且只有一個且必須為大寫,且P必須在T之前,除PAT之外不能再有其他字母。
另:查詢P和T所在的位置,其實可以用find()函式查詢,但是由於本題還要統計P是否存在多個的情況,所以個人認為直接迴圈統計也比較方便。以下是find()函式的用法:
string s; int position_p = s.find('P');//查詢字元P所在的位置