1、内存限制——Memory limit
32768kb==32Mb
int 型数组到百万级别,计算方法a[x][y]内存:x*y*4。
2、memset函数按字节对内存块进行初始化,所以不能用它将int数组初始化为0和-1之外的其他值
(除非该值高字节和低字节相同)。
3、题目有多组数据输入时,尤其没有给出样例组数T的范围时,慎用memset,极易超时。不妨使用栈来保存出现过的元素,实现精准地清空数组,每次数组都用memset,非常浪费时间。
4、数组下标不能超出数组的最大范围。
5、往程序里添加语句时,应考虑上下程序的顺序,比如:本应在变量更新前的语句不能放在更新后。
6、代码越简单越好。代码越长越容易写疵,而且很有可能方法不对。
7、if(); 括号后不小心加了分号,不容易发现。
8、给定n,m,方阵的大小不一定是n*m, 有可能是(n+1) * (m+1)。
9、Dijkstra:适用于权值为非负的图的单源最短路径,用斐波那契堆的复杂度O(E+VlgV)
BellmanFord:适用于权值有负值的图的单源最短路径,并且能够检测负圈,复杂度O(VE)
SPFA:适用于权值有负值,且没有负圈的图的单源最短路径,论文中的复杂度O(kE),k为每个节点进入Queue的次数,且k一般<=2,但此处的复杂度证明是有问题的,其实SPFA的最坏情况应该是O(VE).
Dijkstra、Bellman_Ford、SPFA、Floyd算法复杂度比较
10、对于变量应该在命名时对应所属性质:比如x--black ,y--white。把x改成x_black,把y改成y_white。不容易出现x对应到white这样的错误
11、You should use printf("%%") to print a '%'.
12、强制类型转换
int n;
long long sum=n*n;
/**n*n已经超过int范围,会产生错误**/
正确做法1:long long sum=(long long)n*(long long)n;
正确做法2:long long n;
13、与概率有关的dp递推不仅可以从左格、上格、左上格获得值,同时也可以把当前格的值给予右格、下格、右下格。(例如倒香槟酒题)。
14、同名变量:主函数中的变量n会覆盖全局变量的n,导致全局变量中的n的值仍为0。
15、ceil()、floor()、round()、trunc()函数的返回类型是double。
round函数四舍五入、
trunc函数舍尾。