您的位置:首页 > 编程语言 > C语言/C++

PAT 1003 乙等 (我要通过) c++

2017-05-01 19:23 232 查看


1003. 我要通过!(20)

时间限制

400 ms

内存限制

65536 kB

代码长度限制

8000 B

判题程序

Standard

作者

CHEN, Yue

答案正确”是自动判题系统给出的最令人欢喜的回复。本题属于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
思路:此题的审题十分关键,必须正确理解三个条件的含义才可以都通过测试点,第一个条件简单,但应注意字符P,T也只可以出现一次,出现多次就不满足条件了;条件二的理解也比较容易,但条件三的时候,我刚开始看题就有点晕,没有理解到其要表达的意思. 其实 aPbTc是正确的(设b=n*A, a=m*A, c=k*A),必须满足 k=n*m(当P,T之间的A个数大于1时,已经不是条件二的原形了,是按条件三变换后的了);条件三的意思可以这样理解,xPATx 记过数次xPAATxx , xPAAATxxx, xPAAAATxxxx ... 这样的变换后成为aPbTc(a中有几个A相当于xPATx变换几次), 再变换
一次为aPbATca, 所以可以发现只要满足T之后的A个数等于P之前的A个数乘以P,T之间的A个数即可。

#include <iostream>
#include <string>
using namespace std;

void isPAT(string str);
int main() {

int n(0); // 字符串个数
cin >>n;
for(int i=0;i<n;i++){
string temp;
cin >> temp;
isPAT(temp);
}
return 0;
}

void isPAT(string str){

int P_j(0),T_j(0); //记录P,T的位置
int countP(0), countT(0); //记录P,T的个数
bool status= true; // 当有不合法的字符出现时变为false
for(int i=0;i<str.length();i++){
//有不是P,A,T三种字符的输出NO
if(str[i]!='P' && str[i]!='A'&& str[i]!='T'){
status = false;
}
if(str[i]=='P'){
P_j=i;
countP++;
}
if(str[i]=='T'){
T_j=i;
countT++;
break;
}

}

if((T_j-1-P_j)>=1 && P_j*(T_j-1-P_j)==(str.length()-1-T_j) && countP==1 && countT==1 && status){
cout << "YES" << endl;
}
else{
cout << "NO" << endl;
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c++ pat