1003. 我要通过!(JAVA)

来源:互联网 发布:网络性能测试软件 编辑:程序博客网 时间:2024/06/10 21:13
答案正确”是自动判题系统给出的最令人欢喜的回复。本题属于PAT的“答案正确”大派送 —— 只要读入的字符串满足下列条件,系统就输出“答案正确”,否则输出“答案错误”。

得到“答案正确”的条件是:

1. 字符串中必须仅有P, A, T这三种字符,不可以包含其它字符;
2. 任意形如 xPATx 的字符串都可以获得“答案正确”,其中 x 或者是空字符串,或者是仅由字母 A 组成的字符串;
3. 如果 aPbTc 是正确的,那么 aPbATca 也是正确的,其中 a, b, c 均或者是空字符串,或者是仅由字母 A 组成的字符串。

现在就请你为PAT写一个自动裁判程序,判定哪些字符串是可以获得“答案正确”的。

输入格式: 每个测试输入包含1个测试用例。第1行给出一个自然数n (<10),是需要检测的字符串个数。接下来每个字符串占一行,字符串长度不超过100,且不包含空格。

输出格式:每个字符串的检测结果占一行,如果该字符串可以获得“答案正确”,则输出YES,否则输出NO。

输入样例:
8PATPAATAAPATAAAAPAATAAAAxPATxPTWhateverAPAAATAA
输出样例:
YESYESYESYESNONONONO
首次解题,根据正面思路进行分析,推算出可能判断正确的情况。(此思路繁琐,且未通过所有测试点的测试,本人还未找到原因!
我想用开关的方式去判断
当出现了P的时候,若是第一次出现,则pFlag = true,若不是第一次出现,则pFlag = false,中断循环打印NO
当出现了A的时候,若此时pFlag = false,说明P还未出现,则A应该出现在P的左边(若有P出现的话),此时left++,
若此时pFlag = true && tFlag = false, 说明P出现过一次,且T还未出现,则此时A应该出现在P,T中间,此时middle++,
若此时pFlag = true && tFlag = true, 说明P,T均出现过一次,则此时A应该出现在T的右边,此时right++;
当出现了T的时候,若此时有pFlag = true, aFlag = true, tFlag = false,即P有且仅有出现过一次,A出现过,T未出现过,则tFlag = true, 否则打印NO
最后判断YES的时候,在上述情况均未打印NO的情况下,还需满足pFlag = true, aFlag = true, tFlag = ture.
以及根据题意推断出的附加条件(此处参考:http://zhan.renren.com/h5/entry/3602888498047009866):
//根据条件2可得P,T均只出现一次,且P在T之前,且P与T之间至少有一个A,也就是t_pos-p_pos>=2
 //根据条件3可得,若aPbTc正确,那么由条件2可知,b=A且a=c,再由条件3中aPbATca正确可知aPAATaa正确,再根据条件3(此时b=AA,c=aa)得aPAAATaaa正确,由此归纳得P之前的A个数乘以P,T之间的A个数应等于T之后A的个数,即应满足p_pos*(t_pos-p_pos-1)==(len-t_pos-1)
程序:
package com.PATtest.PATBasicLevelPractise;/* * 提交系统中 有一个测试点未通过 *///import java.util.ArrayList;import java.util.Scanner;public class Test1003 {public static void main(String[] args) {// TODO Auto-generated method stubScanner input = new Scanner(System.in);String strN = input.nextLine();char ch[] = strN.toCharArray();int n = Character.getNumericValue(ch[0]);//ArrayList<String> al = new ArrayList<String>();for (int i = 0; i < n; i++){String temp = input.nextLine();isRight(temp);}input.close();}public static void isRight(String str){char ch[] = str.toCharArray();boolean pFlag = false, aFlag = false, tFlag = false;int left = 0, middle = 0, right = 0;for (int i = 0; i < ch.length; i++){if (ch[i] == 'A'|| ch[i] == 'P' || ch[i] == 'T'){if (ch[i] == 'P'){if (!pFlag){pFlag = true;}else{System.out.println("NO");pFlag = false;break;}}if (ch[i] == 'A'){if (!pFlag){left++;}else if (pFlag && !tFlag){middle++;}else if (pFlag && tFlag){right++;}if (pFlag && !tFlag){aFlag = true;}}if (ch[i] == 'T'){if (pFlag && aFlag && !tFlag){tFlag = true;}else{tFlag = false;System.out.println("NO");break;}}}else {System.out.println("NO");pFlag = false;break;}}//System.out.print("P = "+pFlag+" A = "+aFlag+" T = "+tFlag);//System.out.println("left = "+left+"middle = "+middle+"right = "+right);if (pFlag && aFlag && tFlag){if (right == (middle * left)){System.out.println("YES");}else {System.out.println("NO");}}}}
但是根据本人原先的思路,并未能通过所有的测试点。
之后,上网查找,看到@脱水的兔子的这篇博客,http://blog.csdn.net/wyxdexyq/article/details/23255135
此处使用的是反向思维,即找到不满足的情况,在此题中,这种思路的应用使得解答十分的简答明了。
根据他的思路,我重新写了java版本的程序,此程序通过了所有测试点的测试。
完成所有测试点的测试的程序:
package com.PATtest.PATBasicLevelPractise;import java.util.Scanner;public class Test1003_1 {public static void main(String[] args) {// TODO Auto-generated method stubScanner input = new Scanner(System.in);String strN = input.nextLine();char ch[] = strN.toCharArray();int n = Character.getNumericValue(ch[0]);//ArrayList<String> al = new ArrayList<String>();if (n >= 10){System.exit(-1);}for (int i = 0; i < n; i++){String temp = input.nextLine();isRight(temp);}input.close();}public static void isRight(String str){char ch[] = str.toCharArray();//boolean pFlag = false, aFlag = false, tFlag = false;//int left = 0, middle = 0, right = 0;if ( ch.length > 100){return;}int pos_p = 0, pos_t = 0;int count_p = 0, count_t = 0, count_a = 0;for (int i = 0; i < ch.length; i++){if (ch[i] == 'P'){count_p++;pos_p = i;}if (ch[i] == 'A'){count_a++;}if (ch[i] == 'T'){count_t++;pos_t = i;}}if (ch.length != (count_p+count_a+count_t) || count_p > 1 || count_t > 1 || (pos_t - pos_p) <= 1 || (pos_p*(pos_t-pos_p-1) != (ch.length - pos_t - 1))){System.out.println("NO");}else{System.out.println("YES");}}}

0 0
原创粉丝点击