zoukankan      html  css  js  c++  java
  • PAT-1003

    1003. 我要通过!(20)

    时间限制
    400 ms
    内存限制
    65536 kB
    代码长度限制
    8000 B
     

    答案正确”是自动判题系统给出的最令人欢喜的回复。本题属于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

      作为一道练手题,本体着实符合ACM的题的惯例——“简单题的题目还是带有引申含义的”。刚开始看题基本只能看懂两个条件,可能是翻译的原因所以题目的意思可以说是有点用翻译应用翻译翻译的意思。我简单的把我解本体的思路列举如下:

      首先第三个条件上来有个“如果”,这个明显是告诉有前提的,排除第一个条件后我们可以基本确定是通过第二个条件来推定,好了我们根据正则表达式的特点,知道基本是#PAT#的模型,所以就有PAT三个字母,因为题目要求每个测试输入包含1个测试用例,所以我们假设就是PAT作为正确的表达式,有第三个条件”aPbTc “正确,所以ac都是null,bA,同时”aPbATca”也是正确的,所以我们肯定”PAAT”也是正确的,我们把其再看成”aPbTc”型,就有”PAAAT”也是正确的;再来我们假定”APATA”正确,所以根据”aPbTc “,可以推的”APAATAA”正确,继续还有”APAAATAAA”等正确;可以看出 PA的个数乘 P T中间的A的个数 等于TA的个数(可能先看出是倍数关系),好了本题基本AC了。

     1 /*
     2 https://www.patest.cn/contests/pat-b-practise/1003
     3 author:LY  2016.06.25
     4 */
     5 #include<iostream>
     6 #include<string>
     7 using namespace std;
     8 
     9 bool judge(string s)
    10 {
    11     //先判断字符串是否只含有P A T
    12     for(int i=0;i<s.size();i++)
    13         if(s[i]!='P'&&s[i]!='A'&&s[i]!='T')
    14         { 
    15             return false; 
    16     }
    17     //根据题意可知 P前A的个数乘 P T中间的A的个数 等于T后A的个数
    18     int k1=0,flag1=0;   // P前A的个数
    19     int k2=0,flag2=0;   //P T中间的A的个数
    20     int k3=0;   //T后A的个数
    21     
    22     int kp=0;   //P的个数
    23     int kt=0;   //T的个数 
    24     for(int i=0;i<s.size();i++)
    25     {
    26         if(s[i]!='P'&&flag1==0&&flag2==0)
    27         { 
    28             if(s[i]=='A') 
    29             k1++; 
    30         }
    31         if(s[i] =='P') {flag1=1;kp++;}
    32         
    33         if(s[i]!='T'&&flag2==0&&flag1==1)
    34         { 
    35             if(s[i]=='A') 
    36             k2++; 
    37         }
    38         if(s[i]=='T') {flag2=1;kt++;}
    39         
    40         if(flag2==1&&flag1==1)
    41         {
    42             if(s[i]=='A') 
    43             k3++; 
    44         } 
    45     } 
    46     
    47     //P T的个数为1 且A的个数大于1 
    48     if(kp!=1||kt!=1||k1+k2+k3==0)
    49         return false; 
    50     if (k2!=0&&k1*k2==k3)
    51         return true;
    52     else 
    53         return false; 
    54 } 
    55 int main()
    56 {
    57     int n;  //样例数
    58     scanf("%d",&n); 
    59     string s[10]; 
    60     for(int i=0;i<n;i++)
    61     {
    62         cin>>s[i]; 
    63     } 
    64     
    65     for(int i=0;i<n;i++)
    66     {
    67         if(judge(s[i]))
    68           printf("YES
    ");
    69          
    70          else
    71            printf("NO
    ") ;
    72     } 
    73     
    74     return 0;
    75 } 

      日进一小步,月过一大步~~加油!!!

  • 相关阅读:
    Spring中bean的scope详解
    【转】Servlet生命周期
    layui切换子页面销毁定时器,切换页面失效
    工具记录 [部分摘抄 , 持续更新记录中]
    常用js对dom操作的分装[摘抄记录中....]
    常用js函数的封装集合,更新中...
    360安全浏览器的兼容显示页面
    关于浏览器弹出拦截窗口
    电脑连接小米盒子测试App记录
    面试 & 学习网址记录
  • 原文地址:https://www.cnblogs.com/ly199553/p/5528456.html
Copyright © 2011-2022 走看看