刷PAT时的经验

-----------------------------------------------【Basic Level】-----------------------------------------------

1.数字型输入的case,考虑开头有0,如1→001

2.小数型输入的case,考虑以点号.结尾,如12→12.

3.扣题给sample的字眼,如B1054,输出将结果count的值分为1和非1,所以固定输出不一样:

...1 number is ...

...%d numbers is.. 多一个s

if(counta == 0)printf("The average of 0 numbers is Undefined\n");
else if(counta == 1)printf("The average of 1 number is %.2lf\n", value[0]);
else {
    double avg = 0.0,sum=0.0;
    for(j=0; j<counta; j++)
    sum+=value[j];
	avg = sum/counta;
	printf("The average of %d numbers is %.2lf\n", counta, avg);
}

4.浮点数乘运算

start和endd先乘和后乘(double)d时,在PAT  B1062最简分数上卡在case#3,不知道为什么

5.涉及浮点数的循环

用while和for效果不一样,不知道为什么,测试不出来,在PAT  B1062最简分数上卡在case#4

6.input的字符串,意义不一样,规范也可能不一样,比如B1062试密码:

题目说,第一行给定密码不包含空格tab等字符,因此可以用cin直接读入,但接下来每一行的尝试密码,题目只说“以回车结束的非空字符串”,因此虽然尝试密码中不会有回车符,但可能出现空格tab等符号,就不能用再cin读入了,应该改用getline读。

所以,对应同一道题给的不同字符串,应想到由于它们的意义不一样,串中就可能出现一些字符,就要改变读入的方式

7.用cin读完一个字符串,接下来改用getline读之前,要用getchar()吸收换行符。用getline得到的换行符用cout打印看不见,如执行getline(cin, tp),然后输入一个换行,但执行cout<<"**"<<tp<<"**";会输出****,中间的tp不会换行输出。但string tp="\n"再用cout打印就可以换行。

8.B1079数字回文串那道题,题目不要求去开头的0(在测试用例2中有0开头数),如0001,应打印0001+1000=1001...而不是去0看成1来算。需要注意的是:对于此类判断型的题,可能初始条件就已经符合,如初始给101,已经是回文串,就不要再算101+101=202...,要直接打印101 is xxx.

9.计算中可能依据题意得到了小数(题中没说有小数),如B1088:

最后丙的值可能是小数,因为用乙的值除以Y得到,注意int与double型转换与比较。

-----------------------------------------------【Advanced Level】-----------------------------------------------

10.尽量不用cout输出,会超时。

11.开数组时的初始化不能代替用memset,最好用memset初始化数组,库文件string.h,卡在A1003上

12.有严格内存限制的题,如A1029找中位数,在存储数组时可以结合要求的值(中位数)的特征(在1 2数组之并的中间),考虑边存边计算,因为求两个有序数组的中位数不需要第二个数组全部的数据,在比较到第median个时就已经知道中位数是多少了,就不需要把2数组读完,减少存储量。同时1数组和2数组比较时可以弹出头部数据,减少内存占用。

13.用fill初始化二维数组时,写成:

而不是fill(dist, dist + 501*501, INF),要是dist[0],一维数组则不用。

14.一种用printf输出部分string字符串的方法,j 指向要输出的串的第一位

15.对vector数组(vector<int> a[10],a的每个元素都是一个vector)排序,可以用sort,sort(a, a+10),结果是按每个vector的逐个元素排序,即:

如:
10 3 3 6 2
10 3 3 6 2
10 4 10
10 5 2 7

若要达到从大到小效果,从a[9]到a[0]输出即可。

16.一种c++内置的排序结构体:greater降序, less升序,库文件#include<functional>

使用方法:(1) sort排序时默认为升序排序,使用sort(a, a+10, greater<int>())可变为降序排序

(2) multiset(可重复元素的set)定义:multiset<int,greater<int>> lower;由于set自带升序排序,定义时加入greater<int>()可让set内部变为降序排序

17.命名函数时注意“避嫌”,如自定义stoi(),在codeblocks可以编译通过,但在PAT选用C++(G++)编译错误,可修改为stoii。

猜你喜欢

转载自blog.csdn.net/m0_37663482/article/details/86384903