標籤:bool 完全 輸出 長度 div pac logs code 遞推
1003. 我要通過!(20)時間限制400 ms記憶體限制65536 kB代碼長度限制8000 B判題程式Standard作者CHEN, Yue
“答案正確”是自動判題系統給出的最令人歡喜的回複。本題屬於PAT的“答案正確”大派送 —— 只要讀入的字串滿足下列條件,系統就輸出“答案正確”,否則輸出“答案錯誤”。
得到“答案正確”的條件是:
1. 字串中必須僅有P, A, T這三種字元,不可以包含其它字元;
2. 任意形如 xPATx 的字串都可以獲得“答案正確”,其中 x 或者是Null 字元串,或者是僅由字母 A 組成的字串;
3. 如果 aPbTc 是正確的,那麼 aPbATca 也是正確的,其中 a, b, c 均或者是Null 字元串,或者是僅由字母 A 組成的字串。
現在就請你為PAT寫一個自動裁判程式,判定哪些字串是可以獲得“
答案正確”的。
輸入格式: 每個測試輸入包含1個測試案例。第1行給出一個自然數n (<10),是需要檢測的字串個數。接下來每個字串佔一行,字串長度不超過100,且不包含空格。
輸出格式:每個字串的檢測結果佔一行,如果該字串可以獲得“答案正確”,則輸出YES,否則輸出NO。
輸入範例:
8PATPAATAAPATAAAAPAATAAAAxPATxPTWhateverAPAAATAA
輸出範例:
YESYESYESYESNONONONO
題目分析:
1.字串中必須僅有P, A, T這三種字元,不可以包含其它字元;
2.任意形如 xPATx 的字串都可以獲得“答案正確”,其中 x 或者是Null 字元串,或者是僅由字母 A 組成的字串;
這裡要注意Null 字元串不是空格!!!即正確形式為PAT、APATA、AAPATAA等。P之前的A個數與T之後的A個數相等。
3. 如果 aPbTc 是正確的,那麼 aPbATca 也是正確的,其中 a, b, c 均或者是Null 字元串,或者是僅由字母 A 組成的字串。
這個要求是相對而言比較有難度的,需要仔細分析,一開始拿到可能完全不理解題意。aPbATca正確的前提是aPbTc正確,那麼如何保證aPbTc正確呢?
根據之前的條件可知,能判斷正確的必然只有條件二。即第一次遞推時,aPbTc滿足條件二,b==‘A‘,a==c;
遞推關係:
以此類推我們可以總結出一個關係,T後面A的個數等於P前A的個數乘以P和T之間的A的個數。
這道題不難但是條件三挺繞的emmm,我是用字串寫的調用的str.length(),網上大部分都是直接用的int去數的,本質是差不多的~
起初是看到三個功能所以寫了三個函數,後來發現函數一是不必要的就注釋掉了~
1 #include<iostream> 2 #include<string> 3 using namespace std; 4 bool fun1(string m); 5 bool fun2(string m); 6 bool fun3(string m); 7 int main() 8 { 9 int num;10 cin >> num;11 string a[10];12 for (int i = 0; i < num; i++)13 cin >> a[i];14 for (int i = 0; i < num; i++)15 {16 //bool first = fun1(a[i]);17 bool second = fun2(a[i]);18 bool third = fun3(a[i]);19 if ((/*first&&*/second) || (/*first&&*/third))20 cout << "YES" << endl;21 else22 cout << "NO" << endl;23 } 24 }25 bool fun1(string m)26 {27 int n = m.length();28 for (int j = 0; j < n; j++)29 {30 if (m[j] != ‘P‘ && m[j] != ‘A‘ && m[j] != ‘T‘)31 return false;32 }33 return true;34 }35 bool fun2(string m)36 {37 int j = 0;38 string str1, str2, str3;39 for (; m[j] == ‘A‘; j++)40 {41 str1 += m[j];42 }43 if (m[j] != ‘P‘ || m[j + 1] != ‘A‘ || m[j + 2] != ‘T‘)44 return false;45 j += 3;46 for (; m[j] == ‘A‘; j++)47 {48 str2 += m[j];49 }50 if (j != m.length())51 return false;52 if (str1 != str2)53 return false;54 return true;55 }56 bool fun3(string m)57 {58 int j = 0;59 string str1, str2, str3;60 for (; m[j] == ‘A‘; j++)61 {62 str1 += m[j];63 }64 if (m[j] != ‘P‘)65 return false;66 j += 1;67 for (; m[j] == ‘A‘; j++)68 {69 str2 += m[j];70 }71 if (str2 == "")72 return false;73 if (m[j] != ‘T‘)74 return false;75 j += 1;76 for (; m[j] == ‘A‘; j++)77 {78 str3 += m[j];79 }80 if (j != m.length())81 return false;82 if (str3.length()!=(str1.length()*str2.length()))83 return false;84 return true;85 }
PAT-乙級-1003(C++)