• Day011 PAT乙级 1003 我要通过


    PAT乙级 1003 我要通过

    题目

    分析

    一、这一题需要按照格式输出 PATPAATAAPATAAAAPAATAAAA 等字符串,符合要求输出YES,否则输出NO

    二、这一题的关键在于字符串的三个条件

      1. 字符串必须只能由P,A,T三个字母组成,不能多也不能少
      2. xPATx格式的字符串符合要求,x可以是任意数量的A
      3. 这个条件有点难理解
         ①“如果 `aPbTc` 是正确的”的意思是:在 `aPbTc` 符合条件2时,也就是a和c的数量相等,b等于A
         ②“那么 `aPbATca` 也是正确的”的意思是: `aPAATca` 也是正确的(此时, `aPAATca` 可以看成是新的 `aPbTc` ,套娃)
    

    三、这题的关键在于寻找PAT中A出现的规律,不然如果硬做会很麻烦。把P前面的A称为a,PT中间的A称为b,T后面的A称为c,根据条件可以得到以下关系:

    输入样例中正确的例子:

    a b c
    PAT 0 1 0
    PAAT 0 2 0
    AAPATAA 2 1 2
    AAPAATAAAA 2 2 4

    输入样例中错误的例子:

    a b c
    APAAATAA 1 3 2
    APT 1 0 0

    a从1增加到5:

    a b c
    APATA 1 1 1
    AAPATAA 2 1 2
    AAAPATAAA 3 1 3
    AAAAPATAAAA 4 1 4
    AAAAAPATAAAAA 5 1 5

    a从1增加到5,b从1增加到5:

    a b c
    APATA 1 1 1
    AAPAATAAAA 2 2 4
    AAAPAAATAAAAAAAAA 3 3 9
    AAAAPAAAATAAAAAAAAAAAAAAAA 4 4 16
    AAAAAPAAAAATAAAAAAAAAAAAAAAAAAAAAAAAA 5 5 25

    四、可以很明显地发现,a、b、c之间的关系是a*b=c。原因在于,a与c相等,b增加一个A,c就会变成 ca ,相当于乘2,增加两个A,c就会变成 caa ,相当于乘3,所以a*b可以算出c

    五、弄清关系之后就可以开始写代码了

    代码

    import java.util.Scanner;
    public class Main {
        public static void main(String[] args) {
            Scanner cin = new Scanner(System.in);
            int num = cin.nextInt();
    
            while (num-- > 0) {
                String n = cin.next();//用字符串存储输入的字母
                int indexP = 0;//用于记录P在字符串中第几位
                int indexT = 0;//用于记录T在字符串中第几位
                boolean flag = true;
    
                for (int i = 0; i < n.length(); i++) {
                    if (n.charAt(i) == 'P') {
                        indexP = i;//记录P的位置
                    } else if (n.charAt(i) == 'T') {
                        indexT = i;//记录T的位置
                    } else if (n.charAt(i) != 'A') {
                        flag = false;//判断字符串中是否还有PAT以外的字母
                        break;
                    }
                }
    
                //flag为false说明字符串中还有其他字母,不符合要求
                //indexT - indexP - 1 > 0用于判断P和T之间是否有A,如果没有则不符合要求
                //indexT - indexP - 1表示P和T之间A的个数,indexP表示P之前A的个数,n.length() - indexT - 1表示T之后A的个数
                //如果a*b!=c则不符合要求
                if (flag && indexT - indexP - 1 > 0 && (indexT - indexP - 1) * indexP == n.length() - indexT - 1)
                    System.out.println("YES");
                else
                    System.out.println("NO");
            }
            cin.close();
        }
    }
    

    写到这里PAT的提交是能通过的

    但是程序还有一个bug,那就是没有判断P和T的个数,例如:

    想要解决很简单,创建两个变量用来记录P和T的个数,初始值为0,记录它们位置的同时个数也加1,正常情况下P和T的个数都是1,如果不等于1则说明不符合要求

    package 乙级;
    
    import java.util.Scanner;
    
    public class _1003_我要通过 {
        public static void main(String[] args) {
            Scanner cin = new Scanner(System.in);
            int num = cin.nextInt();
    
            while (num-- > 0) {
                String n = cin.next();
                int indexP = 0;
                int indexT = 0;
                int countP = 0;//记录P的个数
                int countT = 0;//记录t的个数
                boolean flag = true;
    
                for (int i = 0; i < n.length(); i++) {
                    if (n.charAt(i) == 'P') {
                        indexP = i;
                        countP++;//每记录一次个数加1
                    } else if (n.charAt(i) == 'T') {
                        indexT = i;
                        countT++;//每记录一次个数加1
                    } else if (n.charAt(i) != 'A') {
                        flag = false;
                        break;
                    }
                }
    
                //判断P和T的个数是否为1
                if (flag && indexT - indexP - 1 > 0 && countP == 1 && countT == 1 && (indexT - indexP - 1) * indexP == n.length() - indexT - 1)
                    System.out.println("YES");
                else
                    System.out.println("NO");
            }
            cin.close();
        }
    }
    
  • 相关阅读:
    open jdk卸载
    “玲珑杯”ACM比赛 Round #18---图论你先敲完模板(DP+思维)
    “玲珑杯”ACM比赛 Round #18--最后你还是AK了(搜索+思维)
    hdu 5116--Everlasting L(计数DP)
    HDU 5113--Black And White(搜索+剪枝)
    hdu 5573---Binary Tree(构造)
    HDU 5517---Triple(二维树状数组)
    hdu 5975---Aninteresting game(树状数组)
    hdu 5972---Regular Number(字符串匹配)
    HDU 4570---Multi-bit Trie(区间DP)
  • 原文地址:https://www.cnblogs.com/mooncell/p/14744865.html
Copyright © 2020-2023  润新知