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 NONO
思路:此题的审题十分关键,必须正确理解三个条件的含义才可以都通过测试点,第一个条件简单,但应注意字符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;
}
}
相关文章推荐
- PAT1003.我要通过!(20)(简单的c语言风格c++解法)
- 浙江大学PAT上机题解析之1003. 我要通过!(20)
- Pat(Basic Level)Practice--1003(我要通过)
- PAT basic 1003. 我要通过!(20)
- pat 1003. 我要通过!
- PAT : 1003. 我要通过!(20)
- PAT中文版1003.我要通过!
- PAT乙级 1003. 我要通过!
- 编程题目:PAT 1003. 我要通过!(20)
- 编程题目:PAT 1003. 我要通过!(20)
- 浙江大学PAT_乙级_1003. 我要通过!(20)
- PAT 1003. 我要通过!(20)
- PAT_1003. 我要通过!(20)
- PAT Basic Level 1003. 我要通过!(20)
- [PAT]1003. 我要通过!(20)
- 【C++】浙大basic level PAT 代码1001,1002,1003
- PAT Basic Level 1003:我要通过!
- PAT - 1003. 我要通过!(20)
- [PAT]1003. 我要通过!(20)
- PATBasic——1003. 我要通过!(20)