PAT上分記(python + 完美過關)---1003---我要通過

我要通過

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

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

字符串中必須僅有 P、 A、 T這三種字符,不可以包含其它字符;
任意形如 xPATx 的字符串都可以獲得“答案正確”,其中 x 或者是空字符串,或者是僅由字母 A 組成的字符串;
如果 aPbTc 是正確的,那麼 aPbATca 也是正確的,其中 a、 b、 c 均或者是空字符串,或者是僅由字母 A 組成的字符串。
現在就請你爲 PAT 寫一個自動裁判程序,判定哪些字符串是可以獲得“答案正確”的。

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

輸出格式:
每個字符串的檢測結果佔一行,如果該字符串可以獲得“答案正確”,則輸出 YES,否則輸出 NO。

輸入樣例:
8
PAT
PAAT
AAPATAA
AAPAATAAAA
xPATx
PT
Whatever
APAAATAA

輸出樣例:
YES
YES
YES
YES
NO
NO
NO
NO

作者: CHEN, Yue
單位: 浙江大學
時間限制: 400 ms
內存限制: 64 MB

	def check_pat(n):
    b = list()
    for i in range(len(n)):
        p_flag = a_flag = t_flag = el_flag = 0
        for j in range(len(n[i])):
            if n[i][j] == 'P':
                p_flag += 1
            elif n[i][j] == 'A':
                a_flag += 1
            elif n[i][j] == 'T':
                t_flag += 1
            else:
                el_flag += 1
        if p_flag != 1 or t_flag !=1 or a_flag == 0 or el_flag != 0:
            b.append(False)
        else:
            b.append(True)
    return b
    
    
def check_sec(n):
    out = list()
    for i in range(len(n)):
        p_index = n[i].find('P')
        t_index = n[i].find('T')
        if p_index == 0 and t_index == (len(n[i])-1):
            out.append(True)
        elif (p_index == 0 and t_index != len(n[i])-1) or (p_index != 0 and t_index == len(n[i])-1):
            out.append(False)
        elif n[i][:p_index] == n[i][t_index+1:] and min(n[i][:p_index]) == 'A' and max(n[i][:p_index]) == 'A' and n[i][p_index + 1:t_index] != '':
            out.append(True)
        else:
            out.append(False)
    return out
    
    
def check_third(n):
    out = list()
    for i in range(len(n)):
        p_index = n[i].find('P')
        t_index = n[i].find('T')
#         print(((t_index-p_index-1) * n[i][:p_index]) == n[i][t_index + 1:])
        if p_index == 0 and t_index == (len(n[i])-1):
            out.append(True)
        elif (p_index == 0 and t_index != len(n[i])-1) or (p_index != 0 and t_index == len(n[i])-1):
            out.append(False)
        elif min(n[i][:p_index]) == 'A' and max(n[i][:p_index]) == 'A' and ((t_index-p_index-1) * n[i][:p_index]) == n[i][t_index + 1:]:
            out.append(True)
        else:
            out.append(False)
    return out
    
    
if __name__ == '__main__':
    n = eval(input(''))
    a = list()
    for i in range(n):
        a.append(input(''))
    flag1 = check_pat(a)
    
    flag2 = check_sec(a)
    flag3 = check_third(a)
    for j in range(len(a)):
        if flag1[j] == False:
            print('NO')
        elif flag2[j] == True or flag3[j] == True:
            print('YES')
        else:
            print('NO')

解題思路:

這個題目其實最最最重要的就是把題目給理解清楚,我一開始做也是乍一看沒看懂,但是細看發現處處是玄機。

  1. 第一個條件不用說,P、T字母都必須出現一次,且至多一次,A是至少出現一次。
  2. 第二個條件呢,說明,想要答案正確,需要前後對稱,前面幾個a,後面就對應的幾個a,重點來了:對稱的時候,中間只能有一個A,且必須有一個A,這個細節不能漏掉, 這些信息呢是我們可以從第二個條件中理解出來的。
  3. 第三個條件就稍微有點難理解,相較於第二個條件,是一種進階的“答案正確”方式。一開始可以看到,他沒有給出一個固定的說法,說怎麼怎麼樣就直接“答案正確”。他的表述方法是,假如aPbTc”答案正確“,那麼aPbATca也“答案正確"。那麼着意味着什麼呢?
    從第一層開始分析:大家可以想想,aPbTc正確的條件是什麼,是不是就是滿足第二條件,也就是說ac且b’A’,這樣就可以推出aPAATca也答案正確。很多人想到這一層就停住了,然後會發現,其他答案都是正確的,但是最後一個答案是錯的,所以這個只是這個條件的第一層理解。
    更深一層理解是什麼呢?大家不妨把aPAATca也就是a’Pb’Tc’當作第一層來看,就會繼續推出下一層aP(bA)AT(ca)a…所以我們最後可以將第三個條件總結出來,(PT中間A的個數-1)*a == c+a,最終將這個條件加入到判斷函數中就可以得到完美的程序。詳細程序可以看上面的代碼!
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章