1. 程式人生 > 其它 >PTA1003 我要通過! (20 分)

PTA1003 我要通過! (20 分)

PTA1003 我要通過! (20 分)

答案正確”是自動判題系統給出的最令人歡喜的回覆。本題屬於 PAT 的“答案正確”大派送 —— 只要讀入的字串滿足下列條件,系統就輸出“答案正確”,否則輸出“答案錯誤”。

得到“答案正確”的條件是:

  1. 字串中必須僅有 PAT這三種字元,不可以包含其它字元;
  2. 任意形如 xPATx 的字串都可以獲得“答案正確”,其中 x 或者是空字串,或者是僅由字母 A 組成的字串;
  3. 如果 aPbTc 是正確的,那麼 aPbATca 也是正確的,其中 abc 均或者是空字串,或者是僅由字母 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所在的位置