2019-01-21-PAT乙级-1003-我要通过
原文链接:1003 我要通过!
github代码地址:HibisciDai/OJ-PAT-ACM
2019-01-21-PAT乙级-1003-我要通过 编程描述 “答案正确 ”是自动判题系统给出的最令人欢喜的回复。本题属于 PAT 的“答案正确 ”大派送 —— 只要读入的字符串满足下列条件,系统就输出“答案正确 ”,否则输出“答案错误 ”。
得到“答案正确 ”的条件是:
字符串中必须仅有 P
、 A
、 T
这三种字符,不可以包含其它字符;
任意形如 xPATx
的字符串都可以获得“答案正确”,其中 x
或者是空字符串,或者是仅由字母 A
组成的字符串;
如果 aPbTc
是正确的,那么 aPbATca
也是正确的,其中 a
、b
、 c
均或者是空字符串,或者是仅由字母 A
组成的字符串。
现在就请你为 PAT 写一个自动裁判程序,判定哪些字符串是可以获得“答案正确 ”的。
辅助描述 1 2 3 4 5 作者: CHEN, Yue 单位: 浙江大学 时间限制: 400 ms 内存限制: 64 MB 代码长度限制: 16 KB
输入格式 每个测试输入包含 1 个测试用例。第 1 行给出一个正整数 n (<10),是需要检测的字符串个数。接下来每个字符串占一行,字符串长度不超过 100,且不包含空格。
输出格式 每个字符串的检测结果占一行,如果该字符串可以获得“答案正确 ”,则输出 YES
,否则输出 NO
。
输入样例 1 2 3 4 5 6 7 8 9 8 PAT PAAT AAPATAA AAPAATAAAA xPATx PT Whatever APAAATAA
输出样例 1 2 3 4 5 6 7 8 YES YES YES YES NO NO NO NO
算法实现 JAVA(openjdk) 代码 题目一个测试点没有通过
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 import java.util.Scanner;public class Main { public static Scanner sc = new Scanner (System.in); public static boolean keyzero (String str) { boolean p = false ; boolean a = false ; boolean t = false ; for (int i = 0 ; i < str.length(); i++) { char c = str.charAt(i); if (c == 'P' ) { p = true ; } if (c == 'A' ) { a = true ; } if (c == 'T' ) { t = true ; } } if (p && a && t) { return true ; } return false ; } public static boolean keyone (String str) { for (int i = 0 ; i < str.length(); i++) { char c = str.charAt(i); if (c != 'P' && c != 'A' && c != 'T' ) { return false ; } else { return true ; } } return true ; } public static boolean keytwo (String str) { int p = str.indexOf('P' ); int t = str.indexOf('T' ); String pre = str.substring(0 , p); String mid = str.substring(p + 1 , t); String end = str.substring(t + 1 , str.length()); if (pre.length() * mid.length() == end.length()) { return true ; } return false ; } public static void main (String[] args) { int inputInt = sc.nextInt(); String[] inputString = new String [inputInt]; for (int i = 0 ; i < inputString.length; i++) { String str = sc.next(); inputString[i] = str; } sc.close(); for (int i = 0 ; i < inputString.length; i++) { String str = inputString[i]; if (keyzero(str) && keyone(str) && keytwo(str)) { System.out.println("YES" ); } else { System.out.println("NO" ); } } } }
运行结果 1 2 3 4 5 6 7 8 9 状态 分数 题目 编译器 耗时 用户 部分正确 18 1003 Java (openjdk) 151 ms HibisciDai 测试点 结果 耗时 内存 0 答案正确 151 ms 11352 KB 1 答案正确 120 ms 11172 KB 2 答案错误 122 ms 11368 KB 3 答案正确 124 ms 11264 KB 4 答案正确 124 ms 11516 KB 5 答案正确 120 ms 11348 KB
总结
String操作
1 2 3 4 5 6 string[] string.spilt(" " ); string string.replaceAll("a" , "b" ); int string.indexOf(substr); string string.subString(fromIndex.endIndex); string string.subString(fromIndex); char string.charAt(index);
题中出现递归条件分析公式
C++ 代码 原文链接:1003 我要通过!(20)(20 分)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 #include <cstdio> #include <bits/stdc++.h> using namespace std; void solve () { int x; scanf ("%d" , &x); getchar (); for (int i = 0 ; i < x; i++) { int Aqnum = 0 , Aznum = 0 , Ahnum = 0 ; int P, A, T; P = A = T = 0 ; int rp = 1 ; int cnd = 1 ; for (char s; s=getchar (), s != '\n' ;) { s == 'P' ? P++, rp = 2 : s == 'A' ? A++ : s == 'T' ? T++, rp = 3 : cnd = 0 ; switch (rp) { case 1 :Aqnum++; break ; case 2 :if (s != 'P' ) Aznum++; break ; case 3 :if (s != 'T' ) Ahnum++; break ; } } if (P == 1 && A&&T == 1 && Aqnum*Aznum == Ahnum && cnd) printf ("YES\n" ); else printf ("NO\n" ); } } int main () { solve (); return 0 ; }
运行结果 1 2 3 4 5 6 7 8 9 状态 分数 题目 编译器 耗时 用户 答案正确 20 1003 C++ (g++) 3 ms HibisciDai 测试点 结果 耗时 内存 0 答案正确 3 ms 380 KB 1 答案正确 3 ms 380 KB 2 答案正确 3 ms 384 KB 3 答案正确 2 ms 512 KB 4 答案正确 2 ms 384 KB 5 答案正确 2 ms 372 KB