PAT乙级 我要通过(1003)的详细解答过程
在观察完题目要求后,我相信会有不少人对题目要求有点不清楚,尤其是第三点(可能我比较菜,反正我当时理解了半天)。
但这并不影响我们做题,在大致理解题目要求后就观察题目给出的输入及输出,来找规律。
PAT --YES
PAAT --YES
AAPATAA --YES
AAPAATAAAA --YES
PT --NO
APAAATAA --NO
APT --NO
其中不难发现,分为三个板块:
P前面的A数量,设为b1;P与T之间A数量,设为b2;T后面A数量,设为b3
其中满足基本规律:b1*b2==b3,P和T的数量至少且最多仅各为一个
但后面的APT和PT为什么又不满足呢?因此可以大致猜到还有一个限制条件就是b2>0,即P和T之间需要至少有一个A,总结完规律后便可以开始编写代码了,如下:
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
using namespace std;
int main()
{
char a[101];
int n,i,j,k,locate,len,flag=1,flag2=0;
int b1,b2,b3;//b1为P前面有多少个A,b2位P和T之间有多少个A,b3为T后面应该有多少个A
int p=0,t=0;//记录有多少个P和T,必须至少且仅为各1个
memset(a,0,sizeof(a));
cin>>n;
for(i=0;i<n;i++)
{
cin>>a;
len=strlen(a);
flag=1;
flag2=0;
b1=0;
b2=0;
b3=0;
p=0;
t=0;
for(j=0;j<len;j++)
{
if(a[j]!='P' && a[j]!='A' && a[j]!='T')//判定第一关,只能有P、T、A
{
flag=0;
break;
}
else if(a[j]=='P')//检查第二关判定,满足xPATx
{
p++;
if(p>1)//如果P数量大于1,不符合
{
flag=0;
break;
}
k=j-1;
while(k>=0)//P前有多少个A
{
b1++;
k--;
}
locate=j;//记录P在哪个位置,以便后面计算P和T之间有多少个A
}
else if(a[j]=='T')
{
t++;
if(t>1)//如果T数量大于1,不符合
{
flag=0;
break;
}
for(k=locate+1;k<j;k++)//计算P和T之间多少个A
{
b2++;
}
flag2=1;//意思j在数组中遍历的位置已经从T开始了,后面再出现的A便可计入b3
}
else if(a[j]=='A'&&flag2==1)//flag2代表当前j所处于的位置的A为T后面的了
{
b3++;
}
}
if(flag==1&&b2>0&&b1*b2==b3)
printf("YES\n");
else
printf("NO\n");
}
return 0;
}
PTA上运行结果截图 :
顺便想问问各位大佬,上图最后那里的warning是什么意思?
欢迎各位在评论区留言!
觉得该篇文章有用的请不要忘记忘记点击右下角的大拇指~
欢迎大家关注我的公众号:Smooth前端成长记录
公众号同步更新CSDN博客内容,想方便阅读博客的C友可以来关注我的公众号以便获得更优良的阅读体验~