PAT 乙级1003 我要通过
2016-10-16 19:04
330 查看
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 题目的三条规则中只有第三条意思比较难懂,其实就是在形如aPbTc的字符串中,P和T中间每多一个字母A,T后就要多一个字符串a,字符串abc都是仅由A组成的,或者是空字符串。 总结起来其实就是 字符串为“PAT”及其衍生的一系列的,而衍生的字符串符合的规则一定是 P之前的A的数量(称为before)乘以PT之间的A的数量(称为inner)等于T之后的A的数量(称为after),即after=before*inner; 例如:PAT before = 0 inner = 1 after = 0 0=1*0 APATA before = 1 inner = 1 after = 1 1=1*1 所以不符合题意的有: 1、只含有PAT三个其中一个或者两个的; 2、含有除PAT外别的字符的 3、P和T位置不对的(T在P前面) 4、after!=inner*before 代码如下:
#include <stdio.h> int main(){ int n; char q[10][100]; int before= 0,inner= 0,after= 0;//分别存放三处A的数量 int P = 0,T = 0;//存P和T的数量,同时作为PT是否出现的标志 int i,j; int a[10];//分别存放各个字符串的状态 1为正确 其他均为错误 scanf("%d",&n); for(i = 0; i < n; i++){ a[i] = 0; } for(i = 0; i < n; i++){ scanf("%s",&q[i]); } for(i = 0; i < n; i++){ //循环之前初始化这些变量 before = 0; after = 0; inner = 0; P = 0; T = 0; for(j = 0; q[i][j]!='\0'; j++){ //字符串中有其他字母 if(q[i][j] != 'P'&& q[i][j] != 'A'&& q[i][j] != 'T') a[i] = -1; //分别计算P和T的数量 并判断P和T的位置 else if(q[i][j] == 'P' && T == 0)P++;//T此时为0 保证P是在T前面 else if(q[i][j] == 'T' && P == 1)T++; //分别计算三处A的数量 else if(q[i][j] == 'A') { if(P == 0 && T == 0) before++; else if(P == 1 && T == 0) inner++; else if(T == 1 && P == 1) after++; } } //排除有其他字母的情况 if(a[i]==0){ if(j < 3)a[i] = 0;//如果只含两个字母 那么说明一定没有PAT else if(T != 1||P != 1)a[i] = 0;//P和T数量不对 或者位置不对 else if(after == before * inner)a[i] = 1; } } for(i = 0; i < n-1; i++) { if(a[i]==1)printf("YES\n"); else printf("NO\n"); } if(a[n-1]==1)printf("YES"); else printf("NO"); return 0; }
相关文章推荐
- 1003. 我要通过!(20) PAT乙级
- 【PAT】(乙级)1003. 我要通过!(20)
- PAT乙级 1003. 我要通过!(20)
- PAT乙级 1003. 我要通过!(20)
- 浙大PAT乙级 1003. 我要通过!
- 1003. 我要通过!(20)--PAT乙级
- PAT乙级 1003. 我要通过!
- 【PAT乙级真题及训练集】1003. 我要通过!(20)
- [PAT-乙级]1003.我要通过!
- PAT 乙级1003. 我要通过!(20)
- PAT乙级-1003. 我要通过!
- PAT-乙级-1003. 我要通过!(20)
- PAT训练(乙级)—— 1003. 我要通过!(20)
- PAT乙级1003. 我要通过!(20)
- pat 乙级 1003 我要通过!(20)
- 浙江大学PAT乙级试题.1003. 我要通过!(20)C语言
- 浙江大学PAT_乙级_1003. 我要通过!(20)
- PAT_乙级1003. 我要通过!(20)
- PAT 乙级 1003. 我要通过!(20) Java版
- PAT乙级 1003. 我要通过!(20)