在CSP-J/S复赛中,出现成绩为零的情况可能是由多种原因导致的。以下是一些常见的原因:
以2023年CSP-J为例子,先看看第一页题目:
1.文件名(程序名和输入输出文件名)必须使用英文小写,每一题对应的程序名、输入输出文件名都会显示在该表格内,请严格按表格内的名字起名,特别注意程序名后缀是。cpp,不要画蛇添足地在前面多加一个cpp

2.文件夹错误
注意事项提交程序代码文件的放置位置一定要参考各省的具体要求,另外还要看每道题都有自己对应的文件夹。


3.文件读写问题
在OI赛制下,需要通过文件读写来完成输入输出。使用freopen()时必须注意格式中对应输入输出文件名,每题的输入输出文件名严格按照表格上的命名。
有些选手在xxx.in和xxx.out的前面都加上了。\\,unix环境下评测编译错误,正确写法(以小苹果一题为例子),写在main()函数里的头两句
freopen("apple.in","r",stdin);
freopen("apple.out","w",stdout);
另外如果为了方便调试可能会注释掉freopen()函数,但最后一定要记得去掉注释符号,否则也会导致成绩为零。

4.调试代码未注释或删除
有些同学为了调试代码,在程序中间写了一些用于辅助调试的输出语句,调试完成后一定要将这些语句删除或者注释掉,否则会导致“爆零”。
5.数组开得太大
如果数组开得太大,可能会导致内存超限错误或者运行错误。首先,根据题面数据要求,在全局建立合理的数组,并注意不要超过内存限制,如果有些题目本身建议的数据量使用数组会内存超限制的话,说明你就要重新思考自己的算法,而不要强硬去开引起超限的数组。
6.变量初始化问题
在函数内使用变量之前(例如用于计数的变量)记得要初始化,否则系统会在第一次使用该变量时(非赋值的情况下)随机给数值。如果定义成全局变量,则系统会自动初始化0。
7.输出格式问题
如果题目要求数据之间加空格,那就不能换行输出。大小写也要注意,需要仔细看清题目要求。
8.时间、空间超限
每道题都会有相对应的时间空格限制标注在列表中(下表),要注意代码的执行时间不要超过题目的限制,同时注意内存使用不要超过限制。

9.编译环境问题
NOI Linux的环境相对比较严格,代码在Windows环境或者线上提交可能没问题,但在NOI Linux评测后可能编译错误。最典型的是:使用了printf和scanf但只引入了iostream的头文件,却没有引入cstdio头文件。
10.头文件问题
头文件引用缺失,将会导致编译错误,代码无法运行,从而导致0分。
11.变量名冲突
使用using namespace std;之后,全局定义变量名时,容易发生冲突,例如不要使用max, min, hash、x0、x1、y0、y1,time、next、pipe等,会发生编译错误(图一),如果不使用using namespace std;错误就没有了(图二)。建议同学们起名的时候要多注意这些细节。


12.测试环境不同
在不同的测试环境下运行代码可能会有不同的结果,需要确保代码在比赛的评测系统中也能正常运行。
13.不要使用gets函数
gets函数会造成安全隐患,在C++中已经被弃用,所以注意不要使用gets函数。可以使用fgets或getline 代替,注意提前练习并记住写法。
14.注意存盘,不要关机
为了防止突发事件,至少20分钟存盘一次。千万不要关机,否则程序会丢失。如果比赛中途出现电脑问题,例如没有原因的死锁或死机,一定要举手找监考老师来处理。