鱼C论坛

 找回密码
 立即注册
查看: 2307|回复: 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

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


  4. int main(){
  5.         int n,cout_p,cout_a,cout_t,pos_p,pos_t;
  6.         char a[101];
  7.         int b[100];
  8.         cin>>n;                 # cin  是什么东西,这个语句什么意思
  9.         for(int i=0;i<n;++i){
  10.                 cin>>a;
  11.                 cout_p=cout_a=cout_t=pos_p=pos_t=0;
  12.                 int c=strlen(a);
  13.                 for(int j=0;j<c;++j)
  14.                 {
  15.                         if(a[j]=='A')
  16.                                 cout_a++;
  17.                         if(a[j]=='P'){
  18.                                 cout_p++;
  19.                                 pos_p=j;
  20.                         }       
  21.                         if(a[j]=='T'){
  22.                                 cout_t++;
  23.                                 pos_t=j;
  24.                         }
  25.                 }
  26.                
  27.                 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)           // 这里是用来干什么的
  28.                         b[i]=0;
  29.                 else b[i]=1;
  30.         }
  31.         for(int i=0;i<n;++i){
  32.                 if(b[i]==0) cout<<"NO"<<endl;
  33.                 else cout<<"YES"<<endl;
  34.         }
  35. }&#160;
复制代码
最佳答案
2019-2-28 11:35:15
试下代码,看看满分没。代码应该很容易看懂:
  1. #include <cstdio>
  2. #include <cstring>
  3. int main()
  4. {
  5.     int  t;
  6.     scanf("%d\n",&t);
  7.     char c[1005];
  8.     while(t --)
  9.     {
  10.         int l=0;
  11.         int flag=0;
  12.         int locat;
  13.         scanf("%s",c);
  14.         int a;
  15.         for( a = 0; a < strlen(c); a ++)
  16.         {
  17.             if(flag&&c[a]!='A')
  18.             {
  19.                 printf("%d\n",a);
  20.                 flag=0;
  21.             }
  22.             if(c[a]!='P'&&c[a]!='A'&&c[a]!='T')
  23.                 break;
  24.             if(c[a]=='P'&&c[a+1]=='A'&&c[a+2]=='T')
  25.             {
  26.                 locat=a;
  27.                 a+=2;
  28.                 flag=1;
  29.             }
  30.             if(c[a]=='P')
  31.             {
  32.                 l=0;
  33.                 a++;
  34.                 while(c[a]=='A')
  35.                 {
  36.                     l++;
  37.                     a++;
  38.                 }
  39.                 if(l==0)
  40.                 {
  41.                     continue;
  42.                 }
  43.                 if(c[a]=='T')
  44.                 {
  45.                     flag=3;
  46.                     locat=a-l-1;
  47.                     a++;
  48.                 }
  49.             }
  50.         }
  51.         if(flag)
  52.         {
  53.             for( a = 0; a < locat; a ++)
  54.             {
  55.                 if(c[a]!='A')
  56.                 {
  57.                     flag=0;
  58.                     break;
  59.                 }
  60.             }
  61.         }
  62.         if(flag==1&&locat>strlen(c)-3-locat)
  63.             flag=0;
  64.         if(flag==3&&locat*l!=strlen(c)-locat-l-2)
  65.         {
  66.             //printf("%d %d\n",locat*l,strlen(c)-locat-l-2);
  67.             flag=0;
  68.         }
  69.         if(flag)
  70.             printf("YES\n");
  71.         else
  72.             printf("NO\n");
  73.     }
  74.     return 0;
  75. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2019-2-26 21:37:57 | 显示全部楼层
先去学C++,之后再解决这个问题
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

用c,对这题有什么好的解决办法吗?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

  5. bool is_yes(char *buff)
  6. {
  7.         bool flag = false;
  8.         bool a_flag = false;
  9.         for(int i = 0; buff[i]; ++i)
  10.         {
  11.                 switch(buff[i])
  12.                 {
  13.                 case 'P':
  14.                 case 'p':
  15.                         for(int j = i + 1; buff[j]; ++j)
  16.                         {
  17.                                 if(buff[j] == 'A' || buff[j] == 'a')
  18.                                 {
  19.                                         a_flag = true;
  20.                                         continue;
  21.                                 }
  22.                                 if(a_flag && (buff[j] == 'T' || buff[j] == 't'))
  23.                                         flag = true;
  24.                         }
  25.                 case 'A':
  26.                 case 'a':
  27.                 case 'T':
  28.                 case 't':
  29.                         break;
  30.                 default:
  31.                         return false;
  32.                 }
  33.         }
  34.         if(flag)
  35.                 return true;
  36.         return false;
  37. }

  38. int main(void)
  39. {
  40.         int count;
  41.         scanf("%d", &count);
  42.         getchar();
  43.         char (*buff)[1024] = malloc(1024 * count);
  44.         for(int i = 0; i < count; ++i)
  45.         {
  46.                 fgets(buff[i], 1024, stdin);
  47.                 buff[i][strlen(buff[i]) - 1] = '\0';
  48.         }

  49.         for(int i = 0; i < count; ++i)
  50.         {
  51.                 printf("%s\n", is_yes(buff[i]) == true ? "YES" : "NO");
  52.         }
  53.         free(buff);
  54.         return 0;
  55. }
复制代码

评分

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

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

他的意思应该是       aPbATc      或者   aPbTc        最后一个是APAAATC        两个A了就不行
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-2-28 11:35:15 | 显示全部楼层    本楼为最佳答案   
试下代码,看看满分没。代码应该很容易看懂:
  1. #include <cstdio>
  2. #include <cstring>
  3. int main()
  4. {
  5.     int  t;
  6.     scanf("%d\n",&t);
  7.     char c[1005];
  8.     while(t --)
  9.     {
  10.         int l=0;
  11.         int flag=0;
  12.         int locat;
  13.         scanf("%s",c);
  14.         int a;
  15.         for( a = 0; a < strlen(c); a ++)
  16.         {
  17.             if(flag&&c[a]!='A')
  18.             {
  19.                 printf("%d\n",a);
  20.                 flag=0;
  21.             }
  22.             if(c[a]!='P'&&c[a]!='A'&&c[a]!='T')
  23.                 break;
  24.             if(c[a]=='P'&&c[a+1]=='A'&&c[a+2]=='T')
  25.             {
  26.                 locat=a;
  27.                 a+=2;
  28.                 flag=1;
  29.             }
  30.             if(c[a]=='P')
  31.             {
  32.                 l=0;
  33.                 a++;
  34.                 while(c[a]=='A')
  35.                 {
  36.                     l++;
  37.                     a++;
  38.                 }
  39.                 if(l==0)
  40.                 {
  41.                     continue;
  42.                 }
  43.                 if(c[a]=='T')
  44.                 {
  45.                     flag=3;
  46.                     locat=a-l-1;
  47.                     a++;
  48.                 }
  49.             }
  50.         }
  51.         if(flag)
  52.         {
  53.             for( a = 0; a < locat; a ++)
  54.             {
  55.                 if(c[a]!='A')
  56.                 {
  57.                     flag=0;
  58.                     break;
  59.                 }
  60.             }
  61.         }
  62.         if(flag==1&&locat>strlen(c)-3-locat)
  63.             flag=0;
  64.         if(flag==3&&locat*l!=strlen(c)-locat-l-2)
  65.         {
  66.             //printf("%d %d\n",locat*l,strlen(c)-locat-l-2);
  67.             flag=0;
  68.         }
  69.         if(flag)
  70.             printf("YES\n");
  71.         else
  72.             printf("NO\n");
  73.     }
  74.     return 0;
  75. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

评分

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

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-17 17:30

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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