一道题的答案看不懂
题目如下“答案正确”是自动判题系统给出的最令人欢喜的回复。本题属于PAT的“答案正确”大派送 —— 只要读入的字符串满足下列条件,系统就输出“答案正确”,否则输出“答案错误”。
得到“答案正确”的条件是:
1. 字符串中必须仅有P, A, T这三种字符,不可以包含其它字符;
2. 任意形如 xPATx 的字符串都可以获得“答案正确”,其中 x 或者是空字符串,或者是仅由字母 A 组成的字符串;
3. 如果 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
帖子答案代码(不一定正确)
#include<iostream>
#include<string.h>
using namespace std;
int main(){
int n,cout_p,cout_a,cout_t,pos_p,pos_t;
char a;
int b;
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=='A')
cout_a++;
if(a=='P'){
cout_p++;
pos_p=j;
}
if(a=='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=0;
else b=1;
}
for(int i=0;i<n;++i){
if(b==0) cout<<"NO"<<endl;
else cout<<"YES"<<endl;
}
}
先去学C++,之后再解决这个问题
人造人 发表于 2019-2-26 21:37
先去学C++,之后再解决这个问题
用c,对这题有什么好的解决办法吗? 你能解释一下最后一个为什么是NO吗?
#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)
{
switch(buff)
{
case 'P':
case 'p':
for(int j = i + 1; buff; ++j)
{
if(buff == 'A' || buff == 'a')
{
a_flag = true;
continue;
}
if(a_flag && (buff == 'T' || buff == '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) = malloc(1024 * count);
for(int i = 0; i < count; ++i)
{
fgets(buff, 1024, stdin);
buff) - 1] = '\0';
}
for(int i = 0; i < count; ++i)
{
printf("%s\n", is_yes(buff) == true ? "YES" : "NO");
}
free(buff);
return 0;
}
人造人 发表于 2019-2-27 23:13
你能解释一下最后一个为什么是NO吗?
他的意思应该是 aPbATc 或者 aPbTc 最后一个是APAAATC 两个A了就不行 试下代码,看看满分没。代码应该很容易看懂:
#include <cstdio>
#include <cstring>
int main()
{
intt;
scanf("%d\n",&t);
char c;
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')
{
printf("%d\n",a);
flag=0;
}
if(c!='P'&&c!='A'&&c!='T')
break;
if(c=='P'&&c=='A'&&c=='T')
{
locat=a;
a+=2;
flag=1;
}
if(c=='P')
{
l=0;
a++;
while(c=='A')
{
l++;
a++;
}
if(l==0)
{
continue;
}
if(c=='T')
{
flag=3;
locat=a-l-1;
a++;
}
}
}
if(flag)
{
for( a = 0; a < locat; a ++)
{
if(c!='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;
} 根据三条规则来做,第一条好过,第二条就是要PAT两遍的字符串要么是空,要么是相同数量的A组成的字符串,第三条有问题,可能是题目没讲明白,题目的意思是PAT的P和A之间每增加一个A那么在右边要增加一次与左边相同数量A的字符串。
页:
[1]