码迷,mamicode.com
首页 > 其他好文 > 详细

P1003 我要通过!

时间:2019-10-02 22:52:11      阅读:109      评论:0      收藏:0      [点我收藏+]

标签:ret   class   family   tac   strong   gif   ima   ++   lan   

  这道题可就整死我了,第三个条件我看了好久才看懂。当我看懂第三个条件之后,就感觉自己之前好蠢。唉,不多说,先上题

技术图片

  样例较长,比较所以可能会有些模糊。题目的要求很明确,符合三个条件,任意一个条件都视为答案正确,然后输出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 我要通过!

标签:ret   class   family   tac   strong   gif   ima   ++   lan   

原文地址:https://www.cnblogs.com/daker-code/p/11618534.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!