在刷题中遇到的许多低级、隐蔽而又致命的错误,在此整理,谨此改正。
1.库函数的使用:
之前做过许多题,一直没有发现这个致命错误,导致许多题目低效率通过(最坏甚至不能AC)。
如strlen(s)函数计算字符串长度,其本身就含有O(n)复杂度,在做许多题目时,为了方便我直接把函数放在for循环里用,就变成了O(n^2),导致程序效率极低。终于在一次TLE教训后经学长指正发现。
错误:for(i=0;i<strlen(s);i++)
改正:len=strlen(s);
for(i=0;i<len;i++)
经过了这次教训,我还想起来了之前百度之星某题用到过的sqrt函数。当时把sqrt放在循环里,效率低不说甚至WA。后来更正写法后,奇迹般地AC。
错误:for(i=2;i<=sqrt(n-1);i++)
改正:sq=sqrt(n-1);
for(i=2;i<=sq;i++)
2.校赛发现的坑点,32位环境溢出。int整型运算结果如果超出int范围,可能会报错。所以int参与的计算应避免超出int范围,或者统一设置成long long类型。(凡是有 long long参与的比较或运算,最好统一long long单位)
printf("%lld",100000*100000);
显示的并非正确结果。同样
错误:for(int i=1;i*i<=10000000000;i++) //10^10
改正:for(long long i=1;i*i<=10000000000;i++)
3.多校发现的巨坑。。数组下标越界。在编译器正常跑(强大容错),但评测机遇到越界就停止,输出不全造成WA。结果就一直怀疑思路的错误,越走越远。。
一定注意边界条件的处理。
4.codeforces教训。尽可能用多组输入,避免题目没明确要求。
5.codeforces教训。题目给出T>=1(没给出上界),n的和不超过10^6。在每组T中,尽可能跑n遍,不要把整个数组扫一遍,否则TLE。(另memset实现比直接扫快一点)
6.HDU多校发现的玄学。HDU 6415dp时多维数组的状态要与多重循环的顺序保持一致,否则T...
7.网络赛没思路也要暴力一发,说不定就过了。。(数据大水)
8.set,pair等都可用map替代。pair一般不要使用,效率极低。
9.Java递归效率低,递归太深会报异常,尽可能减少递归使用或用循环代替
后续更新。。