【C++】1003 我要通过

   闲聊:拿到题目一脸懵逼,心中直接握草,算了,还是耐心好好学吧!

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

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

字符串中必须仅有 P、 A、 T这三种字符,不可以包含其它字符;
任意形如 xPATx 的字符串都可以获得“答案正确”,其中 x 或者是空字符串,或者是仅由字母 A 组成的字符串;
如果 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

浅析(具体分析看代码)

1、P A T 三个字母必须都有,且只有这三个字母 且 P T 只能出现一次;

2、P 和 T 之间必须至少有一个A;

3、P前A的数量*P、T之间A的数量=T之后A的数量(P、T之间至少一个A)

代码(大佬代码,直接看吧,一开始没有开懂,可以直接跳过,看我下面学习的代码)

#include <iostream>
using namespace std;

int main(){
    int n;
    cin >> n;
    while (n--) {
        char a[100] = { 0 };
        cin >> a;
        int len = strlen(a);
        int p = 0, t = 0, left = 0, mid = 0, right = 0;
        for (int i = 0; i < len; i++) {
            if (a[i] == 'A' && p == 0 && t == 0) {//左
                left++;
                continue;
            }
            else if (a[i] == 'P') {//p
                p++;
                continue;
            }
            else if (a[i] == 'A' && p > 0 && t == 0) {//中
                mid++;
                continue;
            }
            else if (a[i] == 'T') {//t
                t++;
                continue;
            }
            else if (a[i] == 'A' && p > 0 && t > 0) {//右
                right++;
                continue;
            }
            else
                break;
        }
        if (p == 1 && t == 1 && mid != 0 && left * mid == right)// aPATa
            printf("YES\n");
        else if (p == 1 && t == 1 && mid == 1 && left == 0 && right == 0)
            printf("YES\n");
        else
            printf("NO\n");
    }
    return 0;
}

下面是我从“0”开始学习的代码,大家可以可以参考

#include <iostream>
#include <map>
using namespace std;
int main() {
    int n, p = 0, t = 0;
    string s;
    cin >> n;
    for (int i = 0; i < n; i++) {   
        cin >> s;
        map<char, int> m;           //将字符串char转化为整型int
        for (int j = 0; j < s.size(); j++) {
            m[s[j]]++;              //得到字符串中各个字符的数量
            if (s[j] == 'P') p = j; //得到P在字符串中的位置;
            if (s[j] == 'T') t = j; //得到T在字符串中的位置
        }

        /*
        1、P,T只有一个;
        2、A的数量不能为0;
        3、字符串的长度要大于3;
        4、P,T之间至少有一个A;
        5、P前A的数量*P,T之间的数量=T之后的数量!!!
        */
        if (m['P'] == 1 && m['A'] != 0 && m['T'] == 1 && m.size() == 3 && t - p != 1 && p * (t - p - 1) == s.length() - t - 1)
           cout<<"YES"<<endl;
        else
           cout<<"NO"<<endl;
    }
    return 0;
}

Tips:

map

基本格式:

#include <map>

map <类型,类型> 函数名

 //将一个类型转化为另一类型

例如:本题中map<char,int>m,就是将char转化为int,并且命名为m,下面引用时就可以对字符串中的字符进行计数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

isxhyeah

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值