《算法竞赛入门经典》——刘汝佳
手写代码必备手册
的学习笔记整理
CH1 程序设计入门
算法竞赛及面试编程提示
- 不要加上多余的提示和一些多余的 io 函数。
- 包括最后一行,每行以
\n
结束。除非有特殊说明。 - 只做三件事:读入数据,计算结果,打印输出。
- 尽量用
const
关键字声明常数。 - 酷爱在全局定义一个最大整数,例如
MAX
,一般 OJ 题目都有数据规模的限制,所以定义一个常量MAX
表示这个规模,可以不用动态分配内存。 - 经常使用全局变量。虽然工程上这样并不好。
- 不提倡防御式编程,不检查
malloc()/new
返回的指针是否为NULL
;不需要检查内部函数入口参数的有效性;使用纯 C 基于对象编程时,调用对象的成员方法,不需要检查对象自身是否为NULL
。
实验题
环境
mac, Xcode
无法得到理想结果的代码和实际输出样式
|
|
非法计算
|
|
计算结果
nan
nan
73823
|
|
1606416392
CH2 循环结构程序设计
中国剩余定理
题目要求:
每组数据包含3个非负整数a,b,c,表示队尾人数(a<3, b<5, c<7),输出总人数的最小值(或报告无解)。已知总人数不小于10,不超过100。输入到文件结束为止。
我的这个解法为了简便,假设测试输入的a,b,c都满足条件,未对其进行合法判定。其实还应该加入对a, b , c对于3,5,7的大小判定才更加严密。
ChineseRemainderTheorem
韩信点兵问题,又称中国剩余定理
5和7的公倍数除以3余1的最小数是70
3和7的公倍数除以5余1的最小数是21
3和5的公倍数除以7余1的最小数是15
总数除以3、5、7的余数分别设为a,b,c
则sum = a70 + b21 + c*15
再按范围减去105(3, 5, 7的最小公倍数)
完整代码
|
|
子序列的和
输入两个正整数 n<m<10^6
, 输入 1/n^2+1/(n+1)^2+...+1/m^2
,保留5位小数。输入包含多组数据,结束标记为n=m=0。
样例输入:
2 4
65536 655360
0 0
样例输出:
Case1: 0.42361
Case2: 0.00001
|
|
分数化小数
输入正整数a,b,c,输出a/b的小数形式,精确到小数点后c位。a,b<=10^6,c<=100。输入包含多组数据,结束标记为 a = b = c = 0。
样例输入:
1 6 4
0 0 0
样例输出:
Case1: 0.1667
|
|
练习题:
用1,2,3,…,9组成3个三位数abc,def和ghi,每个数字恰好使用一次,要求abc:def:ghi = 1:2:3。按照“abc def ghi”的格式输出所有解,每行一个解。提示:不必太动脑筋(既然题目说了不必太懂脑筋我就用了非常暴力的方法,见method2)
|
|
以下是暴力求解法的片段。详见 暴力法求解的完整代码
|
|
实验
CH5 C++ 与 STL 入门
从 C 到 C++
编译命令
gcc
主要用于编译 C 程序,C++ 程序要用 g++
来编译。详细区别
常数定义
声明数组时,数组大小可以使用 const
声明的常数(在 C99 中是不允许的)。在 C++ 中,更推荐用这种写法,而非使用 #define
声明常数。
布尔
增加 bool
类型,用 true
和 false
来表示真假。虽然仍然可以用 int
来表示,但是 bool
类型的可读性更好。
引用
在参数名之前加上一个 &
符号,表示按引用传递,而不是 C 语言中按值传递。这样,在函数内改变参数的值,也会修改到函数的实参。
字符串
可以把 string
作为流进行读写,#include<sstream>
。虽然 string
和 sstream
都很方便,但是 string
很慢,sstream
更慢,应该谨慎使用。
结构体
C++ 中的结构体除了可以有成员变量,还可以有成员函数。
C++ 中的结构体可以有一个或多个构造函数,在声明变量时调用。
C++ 中的函数(不只是构造函数)参数可以有默认值。