一. 题目
“答案正确”是自动判题系统给出的最令人欢喜的回复。本题属于PAT的“答案正确”大派送 —— 只要读入的字符串满足下列条件,系统就输出“答案正确”,否则输出“答案错误”。
得到“答案正确”的条件是:
1. 字符串中必须仅有P, A, T这三种字符,不可以包含其它字符;
2. 任意形如 xPATx 的字符串都可以获得“答案正确”,其中 x 或者是空字符串,或者是仅由字母 A 组成的字符串;
3. 如果 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
二. 思路
大多数同学包括我做不出来这个题的最大原因是因为读不懂题意,其实题意很简单,得到“答案正确”的三个条件可以用这样总结:
- 字符串只能由且仅有PAT这三个字符组成
- P之前的A数目乘以P与T之间的A的数目等于P后面的A的数目 ——摘自acm_ted
- 以 PAT 为例, 包含PAT这三个字符,且P前面0个A,P和T中间,1个A,0 * 1 = 0 ,T后面0个A,则答案正确
- aPbTc 是正确的,那么 aPbATca 也是正确的,比如a代表2个A,b代表3个A,则aPbTc中的c就是 2 * 3 = 6个A,则aPbATca 中,2 * (3 + 1) = 8 = c + a
三. 答案
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner input = new Scanner(System.in); int length = input.nextInt(); String[] str = new String[length]; for (int i = 0; i < length; i++) { str[i] = input.next(); } new Main().isTrue(str); input.close(); } public static void isTrue(String[] str) { int i = 0; for (i = 0; i < str.length; i++) { int j = 0; for (j = 0; j < str[i].length(); j++) { if (str[i].length() >= 3 && (str[i].charAt(j) == 'P' || str[i].charAt(j) == 'A' || str[i].charAt(j) == 'T')) { } else { System.out.println("NO"); break; } } if (j == str[i].length()) { int a = str[i].indexOf("P"); int b = str[i].indexOf("T") - 1 - a; //aapaat int c = str[i].length() - 1 - str[i].indexOf("T"); if (a * b == c) System.out.println("YES"); else System.out.println("NO"); } } } }
四. 总结
- 本题一开始没做出来的主要原因是没有理解题意
- 理解题意后,很快有了思路,但是一直提交都是不对,每一次都是输出样例的格式有问题,比如YES输成了yes,println输出成了print,比赛的时候,一定要切记输出样例和题目要求完全相同,无论是换行还是大小写。
请登录之后再进行评论