金九银十日,复赛进行时。 CSP-J/S复赛马上就要开始了,但是每年都有很多孩子因为一些不起眼的失误导致一年的努力付之东流。下面为大家准备了一些复赛的注意事项,避免踩坑。
在哪里写代码
第二轮比赛与我们平时在OJ上做题形式不同,需要我们将文件放入规定的目录,然后汇总提交,由系统统一评测后得到分数。那么应该在哪里写代码呢?
一般情况下,主办方会在计算机的E盘(或者D盘)根目录下建立以考生准考证编号命名的文件夹,考生应检查该文件夹名称是否正确(包括编号及大小写字母)。如有错误须立即上报监考人员,由监考人员进行更改。
确认无误后,考生须为每道试题再单独建立一个子文件夹,子文件夹名与对应的试题英文名相同(参见试题封面页)。考生提交的每道试题的源程序(.cpp文件)也必须按照对应的试题命名,分别存放在其子文件夹下。
下面以CSP-J/S 2021 第二轮认证 入门组为例,山东考生张三,准考证号SD-1001,试题封面页如下:
以下演示以Windows环境为主,个别省份使用的是NOI Linux,操作基本类似。
SD-1001考生的答题目录如下:
每道题的源程序要放在对应的子文件夹下:
注意事项
- 仔细检查选手的目录名和题目的目录名,并确定拼写正确
- 源程序文件名(
.cpp
文件)必须使用英文小写,确定拼写正确 - 比赛结束时只保留源程序文件(
.cpp
文件)即可,其它文件可以删除。
如何输入输出
除了答题方式不同,考试还要求每道题从指定的文件输入数据,并将结果保存到指定输出的文件中。以上要求可以通过重定向输入输出来完成,方法如下。
在主函数的开头加入下面两行代码:
freopen("输入文件名", "r", stdin);
freopen("输出文件名", "w", stdout);
输入文件名和输出文件名在试题封面页可以找到。以candy
这个题为例,其输入文件名为candy.in
,输出文件名为candy.out
。
下面是实现代码:
#include <iostream>
using namespace std;
int main()
{
//将标准输入输出重定向到文件中,注意文件名都是小写,不能有多余的空格
freopen("candy.in", "r", stdin);
freopen("candy.out", "w", stdout);
int n, L, R;
cin >> n >> L >> R;
if(L / n != R / n) cout << n - 1;
else cout << R % n;
return 0;
}
加了freopen
后,就不能像之前一样在控制台输入数据测试程序了。测试代码可以这样操作:
- 在该文件夹下新建一个文本文档,将其重命名为
candy.in
(注意扩展名) - 使用记事本打开该文档,将测试样例拷贝过来,并保存
- 运行程序,在目录下会自动生成
candy.out
文件,用记事本打开,检查输出结果。
当然,也可以先注释掉这两行代码,等程序测试无误以后再去掉注释。一定要记得去掉注释!!!
注意事项
- 输入输出的文件名必须使用英文小写,并与试题封面页要求的输入文件名和输出文件名相同,不能有多余的空格。
- 如果注释掉了文件重定向的代码,等程序测试无误后,一定要记得去掉注释
其它注意事项
- 再次提醒,考试结束前请检查文件夹名,文件夹位置,文件名以及文件输入输出。
- 注意数据类型,需要时请使用
long long
或写高精度。(十年OI一场空,不开long long
见祖宗) - 注意数组大小,数组太大将无法运行导致0分。一个
int
为4字节,long long
、double
为8字节,数组大小要在 3 × 1 0 6 3\times10^6 3×106以内。也不要数组太小,小心RE
。 - 不要忘记变量初始化,全局变量会自动初始化。
- 注意下标不要越界,比如背包
j-w[i]
时需要确实其大于等于0。 - 若使用直接输出进行调试,比赛结束前一定要再检查一遍输出的中间结果内容是否被删除,包括多余的换行。
- 涉及到有无解,可以直接输出无解骗分
- 不要使用
next
、Y1
和y1
作为变量名(同理还有hash
、time
、pipe
、yn
、j0
、j1
、jn
),会导致CE
。另外不要使用gets
函数(C++14已经移除,用getline
替代)。 - 检查是否直接除以0。
scanf
读取变量不要忘记加地址符。- 不建议使用快读,关闭输入输出同步流即可。
- 编译记得开
-std=c++14
- 输出格式不要出错,忘记输出换行或输出多个空格,如输出一行一定要输出换行。
- 不确定要写暴力。有想法且时间足够须对拍后作为自己的最终代码。
- 优先队列为
priority_queue
(默认大顶堆),哈希表unordered_map
,不要拼错。 double
的比较需要使用fabs
,不能直接==
。例如:
#include <iostream>
#include <cmath> // 绝对值函数头文件
using namespace std;
int main()
{
const double eps = 1e-8; // 限定误差范围
double a = 10.0 / 3;
double b = 3.333333333333 ;
if (fabs(a - b) <= eps) cout << "a和b相等" << endl;
else cout << "a和b不相等" << endl;
return 0;
}
- 等监考老师收完代码再离场。