• 中文
    • English
  • 注册
  • 查看作者
  • 1003. 我要通过!(20)

    一.  题目

    “答案正确”是自动判题系统给出的最令人欢喜的回复。本题属于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

    二.  思路

    大多数同学包括我做不出来这个题的最大原因是因为读不懂题意,其实题意很简单,得到“答案正确”的三个条件可以用这样总结:

    1.   字符串只能由且仅有PAT这三个字符组成
    2.   P之前的A数目乘以P与T之间的A的数目等于P后面的A的数目   ——摘自acm_ted
    3.   以 PAT 为例, 包含PAT这三个字符,且P前面0个A,P和T中间,1个A,0 * 1 = 0 ,T后面0个A,则答案正确
    4.  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");
                }
    
            }
    
        }
    }

    四.  总结

    1.   本题一开始没做出来的主要原因是没有理解题意
    2.   理解题意后,很快有了思路,但是一直提交都是不对,每一次都是输出样例的格式有问题,比如YES输成了yes,println输出成了print,比赛的时候,一定要切记输出样例和题目要求完全相同,无论是换行还是大小写。
  • 0
  • 0
  • 0
  • 1.07w
  • 梁兴健

    请登录之后再进行评论

    登录
    单栏布局 侧栏位置: