错误整理

各种错误整理+其他注意
一、long long(int 64) @10.26 Inside Contest
有些题目虽然读入都是int(longint),但加起来答案会超过int(longint)
很多要求输出方案数的题目没有mod的话很容易超int(longint),有mod要注意中间程是否会超int(longint)。
有时答案甚至会爆long long(int64),如果精度要求不高可以用double,否则要高精度。
如果时间卡得不是很紧的话可以全开long long(int 64)。

二、函数返回值 @10.27 Inside Contest
注意函数一定要有返回值(return),windows下没有返回值会随机返回,若定义布尔函数很容易返回true。而linux下默认返回0。使用g++ -Wall编译命令会有warning提示。

三、特判 @11.2 Inside Contest
在程序大致正确时,发现了少量出错的数据,尤其在时间仓促的情况下不要轻易改动。数据不一定有这种让程序出错的数据。改的时候要慎重,改完一定要把之前一些正确的数据再测一次,防止加了特判后反而其他情况出错了。最后结果本来数据中没有那种错误数据能AC的,但改错了后分数反而少了

四、数组大小 @11.3 Inside Contest
要看清数据范围,尤其是0比较多的时候,不要10^6的范围开成10^5。以及某些时候某些数组要开若干倍不要忘记(边表*2,线段树*4,……)。c++数组爆掉会出现各种灵异状况。当然也不要无故开太大,把1000*1000的数组开成10000*10000,这样就很容易MLE了。在内存紧的时候能滚动就滚动(内存松的时候没必要),不要留下爆内存的隐患,要算好内存。可以直接手算。可以让程序死循环,跑的时候看任务管理器的内存使用增量。也可以在所有数组定义前后定义变量,取地址来查看内存使用量。

五、字符串输出 @11.6 Inside Contest
比如某些博弈论题目,要求输出第一个人还是第二个人能赢,或是第一个人是否能赢,要注意他要求输出的是什么字符串,最好直接从题面中复制,不要自己打,避免打错(大小写、空格、拼写等问题)。复制时要复制全,防止漏复制东西(比如空格),复制后及时在两边加上引号。测样例等数据时仔细检查下输出的和要求的是否一致。
@11.6 Inside Contest

六、精度问题
double/extended精度只有16-18位,对于精度要求非常高的情况可能无法满足。1.大整数开方,10^18开方后的值有效位数有20位左右,如果恰好是xxx.499999的情况,在取整时就会出现误差。可以对取整得到的是+1或-1后check是否是开方后的数。2.分数比大小问题,a/b和c/d比大小,数的范围在10^9时,有效位数会达到18-20位,导致精度流失比较失败。这时可以用乘法代替除法进行比较。3.二分精度问题:判断退出条件的eps不宜过小,否则由于精度损失,每次的mid都是同一个值,进入死循环。4.看准保留几位小数,尤其c++不要直接%lf。5.其他。

七、其他各种错误/手残/脑残等
常见:
①循环变量为i,j,k等,某处把i打成j 或 把j打成i
②变量名x1,x2等,要使用x1时却写成x2。=和==
③某些值或数组未赋初始值。多组数据 数组未清空。
④初始值不够大(小):题目要求的最大(小)值,而将数组初始化时的最大(小)不够大,导致求答案时找不到这个正确的最大值。
⑤各种运算的优先级。尤其是C++的^。
其他:
①将p作为排序数组,使用排序后数组因调用p[i]却错误使用了i,导致排序无效。
②在多个操作中,平行的if判断最好使用else,防止中间的操作中使要判断的值发生改变,引发错误。
③看清是向下取整还是四舍五入还是向上取整。
④多组数据要根据题目,一般都要换行,不要要求换行却没换行。多组数据的题目如果样例只有一组,最好样例复制几组看输出是否相同。

以上错误很多在静态查错中可以发现,但前提是要检查的仔细。过样例后千万不能大意。

C++
1.int全部变long long(可用于查错/修改全部int为long long)
#define int long long
注意int main前面要#undef int
下面再继续#define
2.高精度压位后的输出
printf(“%04d”,x) 输出时补前导0到4位,4可以改成其他数
3.注意windows下I64d,linux下lld,输入输出量不大的情况下推荐用cin、cout
4.定义数组大小不要以0结尾,比如10000的数组,最好末位加个数,比如开10005

其他:
1.文件输入输出最好一开始就打好。如果一定要屏幕输入输出调试,在调试完后便可加好文件,并测试对于in能否产生正确的out,避免文件操作错误。不要到最后来加文件,这样时间过于仓促,如果打错不加测试,整道题的分数就没了。
2.能对拍的题目最好对拍下验证正确性(时间允许下)
3.不要吊死在一棵树上,可以先把能打的暴力打完(如果要对拍的话暴力总是要用的。暴力和要对拍的程序相同部分时间允许下最好手打一遍,对拍时可以检查手残错误。)
4.程序中复制过去的语句要检查应该改的地方是否都改了,有没有地方漏改了。
5.样例不是很强且不能对拍时要自己构造小数据,检查程序的正确性,尽量构造数据卡掉自己的程序。
6.最好造一个极限数据用于测试程序是否会RE、TLE,或输出不该输出的负数(比如爆int(longint)了)。
7.最后要记得编译程序。用g++命令,要加-Wall,防止编译失败,也可能发现一些还未发现的错误(比如某些函数没有返回值)。
8.不要过多、过早地优化程序。只要时间复杂度能过就可以了。优化后要及时验证正确性。读入优化不推荐加(noip一般不会卡读入的,在有负数要读入时如果没有判就会导致很多失分)

其他错误或该注意的地方欢迎补充

扫描二维码关注公众号,回复: 2137394 查看本文章

猜你喜欢

转载自blog.csdn.net/xumingyang0/article/details/80978020
今日推荐