鱼C论坛

 找回密码
 立即注册
查看: 1959|回复: 6

[已解决]一道题的答案看不懂

[复制链接]
发表于 2019-2-26 18:34:20 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

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

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

1. 字符串中必须仅有P, A, T这三种字符,不可以包含其它字符;
2. 任意形如 xPATx 的字符串都可以获得“答案正确”,其中 x 或者是空字符串,或者是仅由字母 A 组成的字符串;
3. 如果 aPbTc 是正确的,那么 aPbATca 也是正确的,其中 a, b, c 均或者是空字符串,或者是仅由字母 A 组成的字符串。

现在就请你为PAT写一个自动裁判程序,判定哪些字符串是可以获得“答案正确”的。
输入格式:&#160;每个测试输入包含1个测试用例。第1行给出一个自然数n (<10),是需要检测的字符串个数。接下来每个字符串占一行,字符串长度不超过100,且不包含空格。

输出格式:每个字符串的检测结果占一行,如果该字符串可以获得“答案正确”,则输出YES,否则输出NO。

输入样例:
8
PAT
PAAT
AAPATAA
AAPAATAAAA
xPATx
PT
Whatever
APAAATAA
输出样例:
YES
YES
YES
YES
NO
NO
NO
NO

帖子答案代码(不一定正确)
#include<iostream>
#include<string.h>
using namespace std;


int main(){
        int n,cout_p,cout_a,cout_t,pos_p,pos_t;
        char a[101];
        int b[100];
        cin>>n;                 # cin  是什么东西,这个语句什么意思
        for(int i=0;i<n;++i){
                cin>>a;
                cout_p=cout_a=cout_t=pos_p=pos_t=0;
                int c=strlen(a);
                for(int j=0;j<c;++j)
                {
                        if(a[j]=='A')
                                cout_a++;
                        if(a[j]=='P'){
                                cout_p++;
                                pos_p=j;
                        }        
                        if(a[j]=='T'){
                                cout_t++;
                                pos_t=j;
                        }
                }
                
                if(cout_a+cout_p+cout_t!=strlen(a) || cout_p>1 ||cout_t>1 || pos_p+1>=pos_t || pos_p*(pos_t-pos_p-1)!=strlen(a)-pos_t-1)           // 这里是用来干什么的
                        b[i]=0;
                else b[i]=1;
        }
        for(int i=0;i<n;++i){
                if(b[i]==0) cout<<"NO"<<endl;
                else cout<<"YES"<<endl;
        }
} 
最佳答案
2019-2-28 11:35:15
试下代码,看看满分没。代码应该很容易看懂:
#include <cstdio>
#include <cstring>
int main()
{
    int  t;
    scanf("%d\n",&t);
    char c[1005];
    while(t --)
    {
        int l=0;
        int flag=0;
        int locat;
        scanf("%s",c);
        int a;
        for( a = 0; a < strlen(c); a ++)
        {
            if(flag&&c[a]!='A')
            {
                printf("%d\n",a);
                flag=0;
            }
            if(c[a]!='P'&&c[a]!='A'&&c[a]!='T')
                break;
            if(c[a]=='P'&&c[a+1]=='A'&&c[a+2]=='T')
            {
                locat=a;
                a+=2;
                flag=1;
            }
            if(c[a]=='P')
            {
                l=0;
                a++;
                while(c[a]=='A')
                {
                    l++;
                    a++;
                }
                if(l==0)
                {
                    continue;
                }
                if(c[a]=='T')
                {
                    flag=3;
                    locat=a-l-1;
                    a++;
                }
            }
        }
        if(flag)
        {
            for( a = 0; a < locat; a ++)
            {
                if(c[a]!='A')
                {
                    flag=0;
                    break;
                }
            }
        }
        if(flag==1&&locat>strlen(c)-3-locat)
            flag=0;
        if(flag==3&&locat*l!=strlen(c)-locat-l-2)
        {
            //printf("%d %d\n",locat*l,strlen(c)-locat-l-2);
            flag=0;
        }
        if(flag)
            printf("YES\n");
        else
            printf("NO\n");
    }
    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-2-26 21:37:57 | 显示全部楼层
先去学C++,之后再解决这个问题
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-2-27 09:08:06 | 显示全部楼层
人造人 发表于 2019-2-26 21:37
先去学C++,之后再解决这个问题

用c,对这题有什么好的解决办法吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-2-27 23:13:56 | 显示全部楼层
你能解释一下最后一个为什么是NO吗?

1.png
#include <stdio.h>
#include <stdbool.h>
#include <string.h>
#include <stdlib.h>

bool is_yes(char *buff)
{
        bool flag = false;
        bool a_flag = false;
        for(int i = 0; buff[i]; ++i)
        {
                switch(buff[i])
                {
                case 'P':
                case 'p':
                        for(int j = i + 1; buff[j]; ++j)
                        {
                                if(buff[j] == 'A' || buff[j] == 'a')
                                {
                                        a_flag = true;
                                        continue;
                                }
                                if(a_flag && (buff[j] == 'T' || buff[j] == 't'))
                                        flag = true;
                        }
                case 'A':
                case 'a':
                case 'T':
                case 't':
                        break;
                default:
                        return false;
                }
        }
        if(flag)
                return true;
        return false;
}

int main(void)
{
        int count;
        scanf("%d", &count);
        getchar();
        char (*buff)[1024] = malloc(1024 * count);
        for(int i = 0; i < count; ++i)
        {
                fgets(buff[i], 1024, stdin);
                buff[i][strlen(buff[i]) - 1] = '\0';
        }

        for(int i = 0; i < count; ++i)
        {
                printf("%s\n", is_yes(buff[i]) == true ? "YES" : "NO");
        }
        free(buff);
        return 0;
}

评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +3 收起 理由
RIXO + 5 + 5 + 3 感谢

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-2-28 08:51:17 | 显示全部楼层
人造人 发表于 2019-2-27 23:13
你能解释一下最后一个为什么是NO吗?

他的意思应该是       aPbATc      或者   aPbTc        最后一个是APAAATC        两个A了就不行
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-2-28 11:35:15 | 显示全部楼层    本楼为最佳答案   
试下代码,看看满分没。代码应该很容易看懂:
#include <cstdio>
#include <cstring>
int main()
{
    int  t;
    scanf("%d\n",&t);
    char c[1005];
    while(t --)
    {
        int l=0;
        int flag=0;
        int locat;
        scanf("%s",c);
        int a;
        for( a = 0; a < strlen(c); a ++)
        {
            if(flag&&c[a]!='A')
            {
                printf("%d\n",a);
                flag=0;
            }
            if(c[a]!='P'&&c[a]!='A'&&c[a]!='T')
                break;
            if(c[a]=='P'&&c[a+1]=='A'&&c[a+2]=='T')
            {
                locat=a;
                a+=2;
                flag=1;
            }
            if(c[a]=='P')
            {
                l=0;
                a++;
                while(c[a]=='A')
                {
                    l++;
                    a++;
                }
                if(l==0)
                {
                    continue;
                }
                if(c[a]=='T')
                {
                    flag=3;
                    locat=a-l-1;
                    a++;
                }
            }
        }
        if(flag)
        {
            for( a = 0; a < locat; a ++)
            {
                if(c[a]!='A')
                {
                    flag=0;
                    break;
                }
            }
        }
        if(flag==1&&locat>strlen(c)-3-locat)
            flag=0;
        if(flag==3&&locat*l!=strlen(c)-locat-l-2)
        {
            //printf("%d %d\n",locat*l,strlen(c)-locat-l-2);
            flag=0;
        }
        if(flag)
            printf("YES\n");
        else
            printf("NO\n");
    }
    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-2-28 11:35:50 | 显示全部楼层
根据三条规则来做,第一条好过,第二条就是要PAT两遍的字符串要么是空,要么是相同数量的A组成的字符串,第三条有问题,可能是题目没讲明白,题目的意思是PAT的P和A之间每增加一个A那么在右边要增加一次与左边相同数量A的字符串。

评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +3 收起 理由
人造人 + 5 + 5 + 3 鱼C有你更精彩^_^

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-10-3 08:17

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表