1003 我要經過! (20 分)

題目:

「答案正確」是自動判題系統給出的最使人歡喜的回覆。本題屬於 PAT 的「答案正確」大派送 —— 只要讀入的字符串知足下列條件,系統就輸出「答案正確」,不然輸出「答案錯誤」。測試

獲得「答案正確」的條件是:spa

  1. 字符串中必須僅有 PAT這三種字符,不能夠包含其它字符;
  2. 任意形如 xPATx 的字符串均可以得到「答案正確」,其中 x 或者是空字符串,或者是僅由字母 A 組成的字符串;
  3. 若是 aPbTc 是正確的,那麼 aPbATca 也是正確的,其中 abc 均或者是空字符串,或者是僅由字母 A 組成的字符串。

如今就請你爲 PAT 寫一個自動裁判程序,斷定哪些字符串是能夠得到「答案正確」的。code

輸入格式:

每一個測試輸入包含 1 個測試用例。第 1 行給出一個正整數 n (<),是須要檢測的字符串個數。接下來每一個字符串佔一行,字符串長度不超過 100,且不包含空格。blog

輸出格式:

每一個字符串的檢測結果佔一行,若是該字符串能夠得到「答案正確」,則輸出 YES,不然輸出 NO字符串

輸入樣例:

8
PAT
PAAT
AAPATAA
AAPAATAAAA
xPATx
PT
Whatever
APAAATAA

輸出樣例:

YES
YES
YES
YES
NO
NO
NO
NO

剛開始看題目感受不是很理解,幾回都沒過,只能怪本身語文很差,後來才發現是一個簡單的數學規律,發現規律後就很簡單了。數學

解析:

根據樣例裏的這三組和其輸出結果能夠發現:AAPATAA--YES; AAPAATAAAA--YES; APAAATAA--NO。只要P前面的A的個數乘以PT之間的A的個數的積等於T後面的A的個數且字符串中只含有單個P和T就爲YES,不然NO。即條件三中符合a*b=c。而後看條件二不難發現:條件二包含在條件三中。知道這些後,就能夠經過了。string

代碼:

 

 1 #include <stdio.h>
 2 #include <string.h>
 3 
 4 int main()  5 {  6     int n;  7     scanf("%d",&n);  8     while(n--)  9  { 10         char s[105]; 11         int cnt_p = 0, cnt_t = 0, other = 0; 12         int flag_p, flag_t; 13         scanf("%s",s); 14         int len = strlen(s); 15         for(int i = 0; i < len; i++) 16  { 17             if(s[i] == 'P') 18  { 19                 cnt_p++;    //記錄P的個數
20                 flag_p = i;   //標記P位置
21  } 22             else if(s[i] == 'T') 23  { 24                 cnt_t++;    //記錄T的個數
25                 flag_t = i;   //標記T位置
26  } 27             else if(s[i] != 'A'){ 28                 other++;    //記錄其餘字符個數
29  } 30  } //上述三個條件語句中判斷是否爲A字符的必須放在最後,否則P和T會干擾 31         if((cnt_p != 1) || (cnt_t != 1) || other || (flag_t - flag_p <= 1)) 32             printf("NO\n"); 33         else if(flag_p * (flag_t-flag_p-1) == len - flag_t - 1) 34             printf("YES\n"); 35         else
36             printf("NO\n"); 37  } 38     return 0; 39 }

 總結:

仔細讀題,善於發現規律。io

相關文章
相關標籤/搜索