偶尔几次在做题的时候,会发现好好的代码,复杂度分析完全没有问题,但是一提交就TLE,这个问题困扰了我很久,到今天又做了一道这样的题,决定好好总结一下,
- 首先最常见的原因,c++中的cin和cout都要比c中的scanf与printf用的时间长,但是需要注意的是 w h i l e ( s c a n f ( ) ! = E O F ) while(scanf()!=EOF) while(scanf()!=EOF)一定要添加!EOF这一项,因此一般情况下推荐scanf,printf;接下来是讲述这两者的区别:c++的输入输出是有兼容性的:cin与stdin是一样的, 可以混用,也就是说一个程序里面可以一会用cin一会用stdin。cout和stdout是一样的,可以混用。因为c++要解决这样的兼容性的问题,所以对内存的开销等要求就应该比c更高。所以可以知道了c++的输入输出流比c的慢。
- stl的使用也需要注意:空间几何问题使用map存储已有点对,空间几何用map存储点对,或者map的key值是double一般都会造成TLE的问题。map的读取,插入的复杂度的确是 O ( log n ) O(\log n) O(logn),但是复杂类型的hash可能并没有这么容易,一般这时候直接用动态数组存储后排序再处理是比较不错的选择。queue偶尔也会造成类似的问题,比如在例题中,如果我们调stl中的queue则TLE,但是如果手写一个queue就很快。
- double类型乘除法的大量使用,可以用int,ll做的一定不要用double,double的计算效率很低,并且存在精度问题。
- 大量使用stri