写在2019.9.PAT甲级考前
DEV C++
- 工具->编译选项->-编译器->编译时加入以下命令:std=c++11
- 工具->编译选项->代码生成/优化->连接器->产生调试信息
- 北工大考点还要改成64 bit debug(还是32 bit debug,反正都试试
不能出现汉字,不能用itoa:https://blog.csdn.net/ztmajor/article/details/80938662
将示例输入到控制台有两种方法:https://blog.csdn.net/CrazyOnes/article/details/82558643
近几年PAT报考情况:https://blog.csdn.net/qq_38658814/article/details/82534765
重中之重
1. 几种基本排序算法:插入、冒泡、选择、快速、归并、堆
2. 树的前、中、后、层序遍历,中+其它建立二叉树
3. Dijkstra、DFS、BFS
其它
-
各类型范围
-
整型
-
有符号:
2字节 [-215, 215-1] = [-32768, 32767],4字节[-231, 231-1] = [-2147483648, 2147483647]
8字节 [-263, 263-1] = [-9223372036854775808, 9223372036854775807]
-
无符号
2字节 [0, 216-1] = [0, 65535],4字节[0, 232-1] = [0, 4294967295]
8字节 [0, 264-1] = [0, 1844674407370955161]
-
-
浮点型
float:比特数为32,有效数字为6-7,数值范围为 -3.4E+38 和 3.4E+38
double:比特数为64,有效数字为15-16,数值范围为-1.7E-308~1.7E+308
-
-
溢出
- 当A > 0, B > 0, A + B < 0时为正溢出
- 当A < 0, B < 0, A + B ≥ 0时为负溢出
- 注意中间计算过程存在溢出可能性,见A1058
- 当答案错误时考虑溢出的可能性
-
浮点数判相等:abs(a - b) < 1e-8
-
0在各进制下都是0
-
注意数字小于10时才能用char存
-
转换整型为浮点型:强制类型转换,或 * 1.0
-
注意输入输出样例不一定能反应题目要求的数据类型!见B1020
-
注意题目中是否隐含输入字符串可能为空的条件,见B1033
-
注意题目中字符的限定范围,见B1014/A1061
-
注意题目中平均分等数据的取整方式
-
注意输出时有没有打错字母
-
浮点错误
- 除0
-
段错误
- 越界
- 递归调用过多导致堆栈溢出
-
格式错误
- 画图题出现时,注意题目中埋的坑,见B1027
- 结果数为0时,可能要输出空行,见B1045 / A1101
- 题目没说的话,可以通过“格式错误”猜测
-
答案错误
- 反复读题
- 反复读代码
- 考虑除法造成截断误差、累积误差、float精度不够要double,等等
- 考虑溢出
-
注意id位数不够输出时需要补0的可能性,见A1025
-
要熟悉每行x个数字输出的写法,见B1013
-
科学计数法相关题目要多练,见B1024
-
printf中用%d输出float或者double结果为0:https://blog.csdn.net/rockpk008/article/details/47189267
-
float和double四舍五入区别:https://zhidao.baidu.com/question/1797268803534225067.html
-
cout << cout; 编译能过,输出的东西不知道是啥
-
命令行中ctrl + z表示EOF
-
链表
- 注意结点地址输出格式要求
- 注意对无效结点的处理
-
char* 转string可以直接赋值:string=char*
-
to_string(char) 转换的是char对应的int值
-
可以string str = “”; str += pre;但不可以string str = “” + pre; 暂时不知道原因
-
char数组是以’\0’结尾的
-
getline(cin, str, ‘\n’);
-
string中的find():https://www.cnblogs.com/wkfvawl/p/9429128.html
-
sscanf用法:https://blog.csdn.net/yanyanwenmeng/article/details/82753014
- sscanf(“2013/02/13 14:55:34”,"%d/%d/%d %d:%d:%d",&year, &month, &day, &hour, &minute, &second);
- “hh:mm:ss”<=>"%02d:%02d:%02d"
- sscanf(“str.c_str(), …”)
-
< cmath >:
- ceil、floor、round
- abs
-
< iomanip >:setiosflags(ios::fixed) << setprecision(1)
-
< algorithm >
- sort
- reverse(str.begin(), str.end())
- 二分查找
- 从小到大的排序数组
- lower_bound(begin,end,num):
- upper_bound(begin,end,num)
- 从大到小的排序数组
- lower_bound(begin,end,num,greater() )
- upper_bound(begin,end,num,greater() )
- 注意上下界的设置,见A1010
- 从小到大的排序数组
-
< queue >
- 升序队列:priority_queue <int,vector,greater > q;
- 降序队列(默认):priority_queue <int,vector,less >q; 相当于 priority_queue ;
- priority_queue自定义排序:https://www.cnblogs.com/yalphait/articles/8889221.html
-
< utility >
- pair:https://blog.csdn.net/sevenjoin/article/details/81937695
-
< unordered_map >
-
vector<vector< int >>写成vector<int, vector< int >>,声明语句不会报错,接下来用到push_back等函数时会出现"request for member ‘push_back’ in…"这样的报错
-
若vector vec(n + 1)且使用1-n而不使用vec[0],注意vec[0]的值对排序等后续算法造成的影响
- 排序时不应从begin开始而应从begin+1开始
-
sort自写的cmp函数中,参数类型若漏const会报奇奇怪怪的错误
-
使用find函数查找指定数字的下标:https://blog.csdn.net/qq_41970098/article/details/88086244
用返回的迭代器减去begin()(注意得到的是从0开始的)
-
vector之间比较:https://blog.csdn.net/liuchuo/article/details/52486206
-
vector截断:
- 任意片段:https://blog.csdn.net/skdchxyrs09/article/details/89925627
- resize:https://blog.csdn.net/l1216766050/article/details/85098382
-
vector 的 resize不能清除原内存已有数据数据
- 如此时vector大小为n,再resize(n, value)是不能把数据全变成value的
-
vector赋值:https://zhidao.baidu.com/question/515060119.html
-
std::set和std::multiset为有序序列,而hash_set以及hash_multiset为无序序列。
-
并交差:https://blog.csdn.net/u013095333/article/details/89322501
- set_union(A.begin(),A.end(),B.begin(),B.end(),inserter( C1 , C1.begin() ) );
- set_intersection(A.begin(),A.end(),B.begin(),B.end(),inserter( C2 , C2.begin() ));
- set_difference( A.begin(), A.end(),B.begin(), B.end(),inserter( C3, C3.begin() ) );
注意!以上函数要求两个集合必须是有序的
-
BST左子树<根,右子树≥根
-
BST的中序遍历序列是不减的
-
对完全二叉树当中的任何一个结点(设编号为x,其中根结点编号为1),其左孩子结点的编号一定是2x,而右孩子结点的编号一定是2x+1
-
LCA:https://www.cnblogs.com/JVxie/p/4854719.html
-
求无向图的连通块个数一般有两种方法,见A1013
- 图的遍历
- 并查集:可能需要进行路径压缩,以避免数据超时
-
不能在声明结构体时初始化成员变量:https://zhidao.baidu.com/question/250671496.html
因为此时并未给其分配内存,初值无法存储。
-
malloc的语法是:指针名=(数据类型*)malloc(长度)
- malloc完记得free
- new完记得delete
-
逻辑表达式求值优化:https://www.cnblogs.com/southcyy/p/10249085.html
-
可以考虑对某些数据进行预处理,从而提高效率
-
注意排名并列时是“1、2、3、3、5”而不是“1、2、3、3、4”
-
cent换算为dollar结果要除以100
-
已知起始时间和终止时间,可以不断将起始时间加1,判断其是否到达终止时间
-
two pointers扫描中可以在两个序列最后都添加一个最大(小)数INF,见A1029
-
注意x > 0时,x越大|x|越大;x < 0时,x越小|x|越大
-
N不会被除自己以外的大于根号N的整数整除
-
最大公约数
- 更相减损法
- 辗转相除法
- 最大公约数 * 最小公倍数 = 两数乘积
-
哈希冲突解决方法:https://www.cnblogs.com/wuchaodzxx/p/7396599.html
-
1145 Hashing - Average Search Time:https://blog.csdn.net/liuchuo/article/details/79819316
注意查找停止的条件不只是v[pos] = = a,还有 v[pos] == 0!
注意查找终点是tsize
-
-
大整数运算
- 注意判断是否需要用大整数运算
- 注意大整数加法和乘法时最后一位的进位
- 注意大整数减法和除法时得到的结果要从第一个非0数字开始输出,即注意考虑数据存在前导0的可能性