1003 我要通过! (20 分)

1003 我要通过! (20 分)

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

 

思路:

好的,我遇上了coding生涯里的第一次滑铁卢

反反复复看了三四遍!!!

居然完全没看懂!!

这道题!!

输入输出之间的关联!!!!!

(╯‵□′)╯︵┻━┻

 

所以没有思路

一开始大概的想法是

套用昨天的栈

先判断是不是 P、A、T

然后再过滤A

然后卡在了用例上…

emm,如果AAAA到底是几个并不重要

那这测试用例的 yes和no 是怎么产生的?????

所以,怀着懵懂无知的凌乱心境

我开始翻大神们的经验帖

 

然后终于看懂了

是这样:

 

算法:

主要看condition 3:

如果 aPbTc 是正确的,那么 aPbATca 也是正确的,其中 abc 均或者是空字符串,或者是仅由字母 A 组成的字符串。

 

a:n个A

b:n个A

c:   n个A

 

那么!

aPbTc 就变成了这样

aPbTc

 

然后看看过了的测试用例有什么规律

 

PAT

0*1=0

 

 PAAT

0* 2=0 

 

AAPATAA

 2  *  1 =2

 

AAPAATAAAA

 2  *  2  = 4

 

所以就是 

a * b = c

 

问题就转化成了判断是否符合这个公式!!

 

 

 

 

尝试AC

(一)

最开始搭的框架

后来写不下去了,感觉很不对劲

 

#include <iostream>
#include <stack>
#include <string>
using namespace std;

int main()
{
    int num;
    char right;
    string str;
    stack<int> st;

    cin>>num;
    // condition
    while(!cin>>eof() && !cin>>" "){
        if(num<10){
            for(int i=0; i<num; i++){
            cin>>str;
            }
            while()
        }

        else 
            cout<<"error"<<endl;
               

        }
        
   
    return 0;
}

 

(二)

看了经验帖之后!

把所有可能的组合方案列举出来,最后计算 a, b,c是否符合规律

#include<iostream>
#include<string>
using namespace std;

int main() {
    int n;
    string str;

    cin>> n;
    while(n--) {
        int left(0), mid(0), right(0);
        int p(0), t(0);

        cin>> str;
        for(unsigned int i; i< str.size(); i++) {

            // A..(left A)
            // 0P, 0T
            if(str[i]=='A' && p==0 && t==0) {
                left++;
                continue;
            }

            // ..PA.. (middle A)
            // 1P, 0T
            if(str[i]=='A' && p==1 && t==0) {
                mid++;
                continue;
            }

            // ..PATA.. (right A)
            // 1P, 1T
            if(str[i]=='A' && p==1 && t==1) {
                right++;
                continue;
            }

            if(str[i]=='P') {
                p++;
                continue;
            }

            if(str[i]=='T' && mid>=1) {
                t++;
                continue;
            }


            else
                break;
        }

        // judge
        if(p==1 && t==1 && left*mid==right) {
            cout<<"YES"<<endl;
        } else
            cout<<"NO"<<endl;

    }

    return 0;
}

跑了一下,有个测试用例是错的

AAPATAA

NO

于是发现line15, unsigned int i忘记初始化了

改了之后迎来了AC

 

其他:

 

发现一则神仙代码

https://blog.youkuaiyun.com/liygcheng/article/details/10590585

引用了很多C++自带的库函数,感觉方便很多。

虽然没看懂

 

还有一个是 A?B:C 的高级应用!

https://blog.youkuaiyun.com/oShuaiFeng/article/details/80622269

 

总结:

解题过程中,阅读理解也同样重要…

好吧,还是要集思广益,多看看别人的代码

有些代码虽然大体思路一致,但是还是会因人而异有着细微的差别

而这些细微的差别

有些能让人眼前一亮

有些则显得冗余臃肿,缺少技术含量和美感

(好吧我就是后者)

 

 

 

 

 

 

 

 

 

 

 

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值