ACM(C/C++)需注意的细节
刚接触acm不久,于是乎平时打acm的时候,总是会遇到一些玄学“WA”,“TLE”等问题,几个小时都找不出错误所在,结果
往往大佬一指点,立马AC了(这时就有一种想打人的冲动)。这主要原因是因为acm(我)有(太)很多(菜)细节(了)
要注意,下面就罗列一些平时打acm所见到要注意的地方。(每次有(又)新(被)发(WA)现就会更新)
2019.03.03
- 定义局部静态数组时有大小限制,似乎在100万左右,此时最好定义全局静态数组或者动态数组(动态数组是从内存的堆中分配的空间,可以开的很大);否则你的编译器能正常编译,但一运行几秒后就会异常结束。
- 输出结果不同的题要求不同,有的题限制输出行末不能有多余字符,有的则没有此要求。另外,由于OJ在线评定时使用了重定向,将输入和输出分开了,故在输出时可以一个test一个输出(一般输出后要换行)。
- 使用C++写ACM题时,若用iostream中的cin和cout,记得要开加速(具体如何开问百度),否则很可能你写的完全正确,结果却TLE了。但要注意的是,并不是所有的OJ都支持cin,cout开加速。
2019.04.05
- 使用万能库<bits/stdc++.h>时要注意,国内的oj似乎很多都不支持,使用提交会CE。
- memset函数只能初始化数值数组,若含有string类型元素,则需手动将其初始化为空串“”。
2019.04.05
- 读到文件尾返回的EOF在C/C++里面的值是-1,不是0!
- TLE主要有三种情况,一种是算法本身复杂度过高,一种是在oj时程序一直等待输入,还有一种是程序出现死循环。所以出现TLE时主要要分析这三个方面。
2019.05.02
- 注意!注意!注意!当使用c++中的库函数时,一定要注意库函数的形参要求,如果时浮点数的形参就要小心了,因为浮点数运算有精度限制,当运算数很大时,就有可能产生较大误差,比如pow函数等。
2019.08.07
- 对于double型数据C/C++中的scanf要用%lf格式,而printf均统一用%f格式(printf内部%f格式不管数据是float还是double都转成double型输出)
- 在打题时判断边界条件要注意,判断边界后是否需要结束数据,不要一判断边界条件后就直接输出答案,若有数据没有接收就直接输出答案可是会WA的!
- 做线段树题的时候 ,记得开四倍数组,否则可能会RE,具体证明百度问度娘。
2019.08.21
- 使用long long需谨慎,因为long long实在太慢,对于过于毒瘤的题,可能会TLE。
- 代码不加上using namespace std,用到时直接std::,可以获得一定程度的加速。
- 数据量过大时,快读很有必要。
- for循环次数很大时,迭代器可以考虑用register型。
- 对于经常调用的子函数,加上inline可以起到一定程度的加速作用。
2019.11.07
- ios::sync_with_stdio(false)关闭cin、cout和scanf、printf同步后,不要混用二者,否则WA、RE、TLE到自闭。
2019.11.09
- Poj对cin和cout的支持不太好,经常会出现使用cin、cout就TLE、WA,换成scanf、printf就AC的情况。