P1003 我要通过!
转跳点:🐏
这道题可就整死我了,第三个条件我看了好久才看懂。当我看懂第三个条件之后,就感觉自己之前好蠢。唉,不多说,先上题
样例较长,比较所以可能会有些模糊。题目的要求很明确,符合三个条件,任意一个条件都视为答案正确,然后输出OK。看清楚需求之后,我们来分析一下条件。
条件:
第一种:只含有P、A、T三个字符,少一个都不行,这个意思就是 这字符串至少是长度为 3 的 PAT。
第二种:形如“……”PAT“……”形式的字符串,前后“……”的中的字符只能是由A所构成的字符串且长度必须相等,
也就是形如 APATA, AAPATAA, AAAPATAAA……这样的字符串,也判定为答案正确
第三种:形如aPbTc的字符串如果符合上述两种,那么 aPAbTac 也为“答案正确”。
我们得好好分析一下第三个个条件,单独分析第三个条件会发现无论输入是什么都是OK。所以我们应该结合样例分析。
根据样例里的这三组样例:
AAPATAA --YES;
AAPAATAAAA --YES;
APAAATAA --NO。
这样我们就可以得出一下规律
只要P前面的A的个数乘以PT之间的A的个数的积等于T后面的A的个数且字符串中只含有单个P和T就为YES,否则NO。即条件三中符合a*b=c。然后看条件二不难发现:条件二包含在条件三中。知道这些后,就可以通过了。
最后当然是实现啦:
代码:
1 #include <stdio.h> 2 #include <string.h> 3 #define LEN 101 4 5 int main() 6 { 7 int cnt_str = 0; //字符串个数 8 scanf("%d", &cnt_str); 9 for (int i = 0; i < cnt_str; i++) 10 { 11 char str[LEN]; 12 scanf("%s", str); //读入字符串 13 int cnt_P = 0, cnt_T = 0, isRight = 1; 14 int pos_P = 0, pos_T = 0; //设置P、T的下标 15 for (int i = 0; i < strlen(str); i++) 16 { 17 if (str[i] == 'P') 18 { 19 pos_P = i; //记录P的下标 20 cnt_P++; 21 } 22 else if (str[i] == 'T') 23 { 24 pos_T = i; // 记录T的下标 25 cnt_T++; 26 } 27 else if (str[i] != 'A') 28 { //有其他字符 29 isRight = 0; 30 break; 31 } 32 } 33 if (isRight && cnt_P == 1 && cnt_T == 1) 34 { //如果字符串只有PAT三种字符 且 P、T数量为1 35 int l_A = 0, c_A = 0, r_A = 0; // 声明左、中、右 字符A的数量 36 l_A = pos_P; 37 c_A = pos_T - pos_P - 1; 38 r_A = strlen(str) - pos_T - 1; 39 if (c_A > 0 && l_A * c_A == r_A) 40 { //PT之间有A,且A的数量 左*中 = 右 41 printf("YES\n"); 42 continue; 43 } 44 } 45 printf("NO\n"); 46 } 47 return 0; 48 }
PTA不易,诸君共勉!
大道五十,天衍四九,人遁其一!