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,最终将这个条件加入到判断函数中就可以得到完美的程序。详细程序可以看上面的代码!
发布了16 篇原创文章 · 获赞 3 · 访问量 521

猜你喜欢

转载自blog.csdn.net/godleisen/article/details/103750121