PAT (Basic Level) Practice (中文)_1003 我要通过! (20 分)_C语言实现

  • 题目地址
  • 题目解析:这道题目最大的困难还是在于理解题意。而且当初困惑了我许久,因为才开始接触程序题目,没有一个良好的解题方式。

这里我用我归纳的解题方式,来解决这道问题

1.列出已知条件

a.条件1:字符串必须仅有  PAT  这三种字符,不可以包含其它字符;

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个)  ++1个*A(0个)+n个*A(0个)
A(n个)PA(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;
}

 

猜你喜欢

转载自blog.csdn.net/qq_43269246/article/details/84864159