PAT乙级题1003 我要通过!

答案正确”是自动判题系统给出的最令人欢喜的回复。本题属于 PAT 的“答案正确”大派送 —— 只要读入的字符串满足下列条件,系统就输出“答案正确”,否则输出“答案错误”。

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

  1. 字符串中必须仅有 P、 A、 T这三种字符,不可以包含其它字符;

  2. 任意形如 xPATx 的字符串都可以获得“答案正确”,其中 x 或者是空字符串,或者是仅由字母 A 组成的字符串;

  3. 如果 aPbTc 是正确的,那么 aPbATca 也是正确的,其中 a、 b、 c 均或者是空字符串,或者是仅由字母 A 组成的字符串。

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

输入格式:

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

输出格式:

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

输入样例:

扫描二维码关注公众号,回复: 3162184 查看本文章
8
PAT
PAAT
AAPATAA
AAPAATAAAA
xPATx
PT
Whatever
APAAATAA

输出样例:

YES
YES
YES
YES
NO
NO
NO
NO

1.分析题目,读不懂题目是最伤的。第一个条件不必说,第二个条件开始,形如XPATX就正确,且x为a或者空字符串组成的字符串,之前我理解错的原因是,把两个X看成可以不同,其实是要求两个X也是相同的。也就是说左右两边对称的一定正确。第三个条件真的不太好了理解,aPbTc正确的话,aPbATca也正确,后者想必于前者多了一个A,多了一个a,再看到例子的第四条,AAPAATAAAA,相对于AAPATAA,中间多了一个A,后面多了两个A,也就是就在记数中间A的个数为N,那么尾巴上A的个数一定是前缀A的个数的N倍。(中间A为1个时,两边正好相同)

2.一开始打算是依次读取,例如遇到P之前,一旦读到A以外的字符就NO,遇到P后改判定,遇到A以外的字符就判NO,遇到T后改判定,遇到\n之前出现其他字符就NO,然后统计F,M,B三个部分的A的数量,最后再用一个式子判定就结束。

3.然而始终没写对,后面看了下别人写的,都是将整个字符串一起读入,然后用位置来计算A的数量,emmm,先不管了,明天再说

4.9月12号来更新了一次,但这次写的有两个测试点没通过,明天我想想是哪里没对,改这个真的有点烦人啊

#include<iostream>
#include<string>
using namespace std;
void verify(string str);
int main(){
	int n;
	string str;
	cin>>n;
	while(n--){
		cin>>str;
		verify(str);
	}
	return 0;
} 
void verify(string str){//传入数组,给出结果 
	int j,k;//记录PT的位置
	int P=0,T=0,A=0;//记录PT的数量
	for(int i=0;i<str.length();i++){
		if(str[i]=='P'){
			P++;
			if(P==1) {
				j=i;
			}	
		}
		if(str[i]=='T'){
			T++;
			if(T==1) {
				k=i;
			}	
		}
		if(str[i]=='A'){
			A++;
		}
	}
	if(P==1&&T==1&&A+2==str.length()&&j*(k-j-1)==(str.length()-k-1)){
		cout<<"YES"<<endl; 
	}else{
		cout<<"NO"<<endl;
	}	 
}

猜你喜欢

转载自blog.csdn.net/weixin_38706535/article/details/82500984