坏习纠正

在刷题中遇到的许多低级、隐蔽而又致命的错误,在此整理,谨此改正。

 

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递归效率低,递归太深会报异常,尽可能减少递归使用或用循环代替

 

后续更新。。

posted @ 2017-08-21 00:05  yzm10  阅读(287)  评论(1编辑  收藏  举报