- 题目地址
- 题目解析:这道题目最大的困难还是在于理解题意。而且当初困惑了我许久,因为才开始接触程序题目,没有一个良好的解题方式。
这里我用我归纳的解题方式,来解决这道问题
1.列出已知条件
a.条件1:字符串中必须仅有
P
、A
、T
这三种字符,不可以包含其它字符;b.由条件2可得:PAT 或 A(n个)+PAT+A(n个)
c.由条件3可得:
a P b T c
a P bA T ca
A(0个)+ P+ A(1个) +T +A(0个) A(0个)+ P+ A(1个)+A(n个) +T +1个*A(0个)+n个*A(0个) A(n个)+ P+ A(1个)+ T +A(n个) A(n个)+ P+ A(1个)+A(n个) +T +1个*A(n个)+n个*A(n个) d.结论:(只能由条件1、2(原型)根据条件3(规则)推得的字符串才是YES)
(1)只能有P、A、T;(2)P和T只能有一个,且中间至少一个A;(3)首项A个数*中间A个数==尾项。
2.输入分析
输入格式:每个测试输入包含 1 个测试用例。第 1 行给出一个正整数 n (<10),是需要检测的字符串个数。接下来每个字符串占一行,字符串长度不超过 100,且不包含空格。
这道题目的输入不是特别典型,仅仅知道就可以了。而典型的输入分析当中,我们会遇到一些坑:
a.比如输入说明当中不会明确告诉你正负、输入的具体类型,需要自己用常识来判断,或者根据题意判定;
b.要利用输入的具体值来推算我们需要使用的数据类型和数据结构
3.输出分析:
每个字符串的检测结果占一行,如果该字符串可以获得“答案正确”,则输出 YES
,否则输出 NO
。
这里输出格式的要求也很低,看了都明白。但其他题目你可能会遇到难点:
a.最常见的是末位不得有空格,你可以使用printf(“%c%d”,i?' ':'',num);这样的方式解决(Vs2010好像不能这样,那就换一下printf(“%d%c”,num,i==n?'\n':' ');)
b.还有就是在一些边际条件下的输出,你可能会忽略掉,要记得处理才行。
4.数据结构的选择
这里数量级很小,不用特别考虑,主要是方便为主。
值得一提的是,我们这里的解法使用的动态处理(姑且这样叫),不用存储输入的大量数据,边输入边处理;还利用了一个小数组来记录位置的变化。
而其他情况:
a.构建结构体数组,非常好用,尤其在多个数据比较时,我们可以使用qsort;
b.PAT乙级里面对于link、queue、stack、bag,要求很低,好像我还没遇到过,所以你合理的使用数组可以解决大部分问题是很稳的,并且非常方便;
c.再如我们可以利用aa[128]这样的数组本身的下标来解决ASCII相关的问题,举一反三:很多分值问题也可以用这样的方式解决;
d.特殊的方式,如多项选择题的判断,可以利用数组aa[5]和位运算方式解决,很犀利(这里与该题目不相关,可以跳过)
数组aa[5](0为未选中,1为选中) | aa[0] | aa[1] | aa[2] | aa[3] | aa[4] |
正确答案 | 0 | 1 |
1 | 0 | 1 |
所选答案(情况一) | 1 | 0 | 1 | 0 | 1 |
对 正确和所选 进行异或 ^ 运算(得到错选项目,如==0则全对) | 1 | 1 | 0 | 0 | 0 |
对 错选和正确 进行或 | 运算(若超过正确数目则有错选,否为漏选) | 1 | 1 | 1 | 0 | 1 |
5.算法
我们读了题目,分析了输入输出,最后在构建数据结构的时候其实已经和算法是分不开的了。
事实上解决一个问题,我们的处理方式大都是,将问题拆解成小问题,逐步解决。
在这个问题当中,拆分成两步:
1.记录输入的数据;
2.判定输入是否正确。
拆后分,我们再继续细分
a.怎么记录?(getchar);b.记录哪些?(满足3个if条件的)
a.怎么判定?(if);判定条件有哪些?
通过这样的方式,一步一步把问题变简单,并且拥有十分清晰的逻辑和条理性(自顶向下的解决方式)。
- 我的代码:
#include<stdio.h>
int main()
{
int n;
scanf("%d\n",&n);//这里的\n是为了下面的getchar而使用
char ch;
for(int i=0;i<n;i++)
{
int position=0,aa[3]={0};
while((ch=getchar())!='\n')//该处理方式主要在于,通过每位读取,成功限定了
{ //每位的表达,不是我们需要的表达,直接NO
//是我们需要的表达,我们就记录下
if(ch=='A') aa[position]++;//每个A的位置所在
else if(ch=='P'&&position==0) position=1; //遇到P就转移了,
else if(ch=='T'&&position==1) position=2; //再次遇到就break
else break;//相当于ch=='P'&&position==1,这是不在前三个if中的
}
if(ch=='\n'&&position==2&&aa[1]&&aa[2]==aa[0]*aa[1])//条件的判定
printf("%s\n","YES");
else printf("%s\n","NO");
if(ch!='\n')//若中途停止,剩下的也要读完哦!!!
while((ch=getchar())!='\n');
}
return 0;
}