P1003 我要通过!

Posted daker-code

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 
View Code

  算法不易,诸君共勉!

以上是关于P1003 我要通过!的主要内容,如果未能解决你的问题,请参考以下文章

P1003 铺地毯

P1003 铺地毯

洛谷—— P1003 铺地毯

P1003 铺地毯

P1003 铺地毯

洛谷 P1003 铺地毯 题解