每日盘题——PAT(乙级1003)——我要通过!

博客介绍为PAT写自动裁判程序,判定字符串能否获“答案正确”。给出输入、输出格式及样例,解题思路是将字符串中A个数分三部分,满足n1*n2=n3则正确,还给出部分示例,最后提及代码相关。

/*
 * Copyright (c) 2014, 烟台大学计算机学院
 * All rights reserved.
 * 文件名称:test.cpp
 * 作    者:李晓凯
 * 完成日期:2019年 3 月 17 日
 * 版 本 号:v1.0
 *
 * 问题描述:
 * 输入描述:
 * 程序输出:

 */

答案正确”是自动判题系统给出的最令人欢喜的回复。本题属于 PAT 的“答案正确”大派送 —— 只要读入的字符串满足下列条件,系统就输出“答案正确”,否则输出“答案错误”。

得到“答案正确”的条件是:

  1. 字符串中必须仅有 PAT这三种字符,不可以包含其它字符;
  2. 任意形如 xPATx 的字符串都可以获得“答案正确”,其中 x 或者是空字符串,或者是仅由字母 A 组成的字符串;
  3. 如果 aPbTc 是正确的,那么 aPbATca 也是正确的,其中 abc 均或者是空字符串,或者是仅由字母 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

解题思路:

          暗藏玄机的一道题,1,2容易理解,第3条就有点懵了,其实是包含一个计算方法,要把字符串中A的个数分成三部分,P左边A的个数n1,P和T中间A的个数n2,T右边A的个数n3,如果n1*n2=n3,那么就是“答案正确”,否则就是“答案错误”,(注意P和T的个数只能是1个,多了就不符合了)如下:

         PAT:                            0*1=0

        PAAT:                           0*2=0

        AAPATAA:                    2*1=2

        AAPAATAAAA:               2*2=4

代码:

#include<iostream>
using namespace std;
void isPass(string str)
{
    bool flag;
    int p_num=0,p_site,t_num=0,t_site,a_num=0;
    int len=str.size();
    for(int i=0; i<len; i++)
    {
        if(str[i]!='P'&&str[i]!='A'&&str[i]!='T'){    //出现非P,A,T字符时就是答案错误
            flag=false;                               //标记答案错误
            break;                                    
        }
        else if(str[i]=='A')                          
            a_num++;                                  //记录A的数量,至少出现一次
        else if(str[i]=='P')                          
        {
            p_num++;                                  //记录P的数量
            p_site=i;                                 //标记P的位置
        }
        else if(str[i]=='T')
        {
            t_num++;                                  //记录T的数量
            t_site=i;                                 //标记T的位置
        }
    }
    if((a_num>=1)&&((p_site)*(t_site-p_site-1)==(len-1-t_site))&&(p_num==1)&&(t_num==1))
        //A至少出现一次,满足n1*n2=n3,P,T只能出现一次
        flag=true;                                    //标记答案正确
    else
        flag=false;                                   //标记答案错误
    if(flag)
        cout<<"YES"<<endl;
    else
        cout<<"NO"<<endl;
}
int main()
{
    string str;
    int n;
    cin>>n;
    for(int i=0; i<n; i++)
    {
        cin>>str;
        isPass(str);
    }
    return 0;
}

### PAT乙级库测试点与目列表 PAT乙级库旨在评估考生的基础编程能力和逻辑思维能力。该库包含了多种类型的目,涵盖了基础数据结构、简单算法以及编程语言的应用等方面的内容[^1]。 #### 目特点 这些目通常具有一定的开放性和灵活性,允许不同的解法路径。然而,仅仅能够通过测试案例并不意味着掌握了优解决方案。对于某些特定问,如字符串处理中的模式匹配或是排序操作,理解高效实现方法至关重要[^2]。 #### 推荐刷策略 尽管PAT乙级目的难度相对较低,但为了更好地掌握知识点并提高解决问的能力,建议学习者关注高质量代码的设计原则,在遇到困难时适当借鉴他人优秀的解答方式来优化自己的思维方式和技术栈应用水平。 #### 示例:快速排序的实现 针对具体的技术挑战,比如`1045 快速排序 (25 分)`这样的经典算法练习,除了基本功能外还需要注意边界条件和其他潜在陷阱: ```cpp #include <iostream> using namespace std; void quickSort(int arr[], int low, int high){ if(low >= high) return; // Partition logic here... } int main(){ const int MAXN = 1e6+7; int n, data[MAXN]; cin >> n; for(int i=0;i<n;++i) scanf("%d",&data[i]); quickSort(data, 0, n-1); } ``` 上述代码片段展示了如何构建一个简易版的快速排序框架,实际比赛中应当更加注重细节上的完善以确保程序稳定运行。 #### 数据管理类目实例 另一个例子来自人才评价模型——即`1015 德才论`,它涉及到多维度的数据管理和复杂规则下的对象排序。这里的关键在于合理设计比较器以便于后续的操作能顺利执行: ```cpp struct student { char id[8]; // 学号 int de; // 才干分数 int sum; // 总分 }; bool cmp(const student &a, const student &b){ if(a.sum != b.sum) return a.sum > b.sum; else if(a.de != b.de) return a.de > b.de; else return strcmp(a.id, b.id) < 0; } ``` 这段C++代码实现了基于学生综合表现的个性化排名机制,体现了良好的抽象层次和清晰的功能划分[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值