type
status
date
slug
summary
tags
category
icon
password
🙂
CSP-J/S 第二轮是信竞路上第一个 OI 赛制的挑战,每年都有很多选手因为不了解 OI 赛制的一些制度和策略而导致爆零。本文以 2024 年为例,讲解了 OI 赛制的一些要点,愿各位选手知悉。

2024 年上海 CSP-J/S 活动认证者注意事项

文件输入输出

每年都有一些选手,尤其是第一次参加第二轮(复赛)的选手,因为文件输入输出语句没写或没写对,遗憾爆零。
文件输入输出有多种方式,最简单的是 freopen,它的作用是重定向标准输入输出流,可以将程序的输入和输出从控制台重定向到文件中。假如题目的标题是 airplane,则只需要在 main 函数开头加入这两行:
注意,这里的函数名称和参数不能写错,任意一个地方出错都会导致程序爆零。比如,airplane.in 不能写成 airplane.txt,也不能写成 airplane.in.txt。“r”不能写成“read”,也不能写成’r’(这种情况编译器会报错)。
两行 freopen 中的三个参数,是分别相反的,.in 文件对应着 .out 文件,读取对应着写入,标准输入对应着标准输出。下面三种常见的错误写法,都会爆零。
另外,新手建议不要在程序的末尾写 fclose 函数。因为程序结束后,所占的内存就都释放了,fclose 函数写不写是一样的。新手写的越多,意味着犯错的可能性越大。

程序提交格式

不同省份的提交格式可能不尽相同,常见的有两种。
第一种,以上海为例,在“工作文件夹”(不同的省份这个文件夹的位置不一样,上海是在指定盘,其它省份有可能指的是电脑桌面)中建立以选手准考号命名的文件夹,然后在准考证号文件下内针对每一题再建立一个文件夹,再把源代码提交到对应的文件夹内。请参考本文顶部的《2024年上海 CSP-J/S 活动认证者注意事项》,并以当年各省份的新公告为准。
如果选手只会做前两题,那么在准考证号文件夹内建立前两道题的文件夹即可,当然四题都建文件夹也可以,后两题对应的文件夹里可以是空的。
如果你是用 Code::Blocks 建立的项目,那么每个项目源代码的名称都是 main.cpp。可把main.cpp 拷贝到准考证命名的文件夹内,然后把 main.cpp 重命名成相应的名称,例如 airplane.cpp。
若采用这种提交方式,不需要提交多余的文件,比如 .in 文件、.out 文件、.exe 文件等。.in 和 .out 文件用来帮助选手测试,.exe 是可执行文件。如果把这些文件都提交了,理论上也不会影响分数,因为评分时这些文件会被忽略掉。但不建议以身试法,我不为因此造成的任何后果负责。
第二种方式,以北京为例,是在浏览器中打开一个内网网址,然后把代码直接复制粘贴到网址里面,再点击底部的“提交”按钮即可。这种粘贴代码的网站叫做代码回收系统。
这种方式程序文件名称无所谓(比如 Code::Blocks 项目下的程序文件名叫 main.cpp),只需要把代码直接复制粘贴到网址里即可,跟平时提交到洛谷等在线评测网站的过程是类似的。当然这种方式也不要忘了使用 freopen 进行文件输入输出。

Windows 系统的文件扩展名要显示出来

有些 Windows 系统的电脑的扩展名是隐藏的,一定要让扩展名显示出来,否则轻则影响测试,重则爆零。比如有些机器隐藏了扩展名,选手将程序命名为 airplane.cpp,实际上是 airplane.cpp.cpp;选手将输入文件命名为 airplane.in,实际上是 airplane.in.txt。

熟悉 Code::Blocks

上海考点一般提供 Windows 系统 + NOI Linux 虚拟机方案,如果你所在的省份要求只能使用 NOI Linux 系统,则需要熟悉其自带的编程环境。其中比较好用的 IDE 是 Code::Blocks,以下是它的使用教程。

NOI Linux 建立项目的位置

如果你用的是 NOI Linux 系统,那么不要把 C++ 项目项目建立在桌面,因为“桌面”这两个字是汉字,会导致无法编译。
notion image
可建立在 Linux 用户的家目录(即桌面的上一级目录)中,这样就不会影响编译。
notion image

NOI Linux 建立 .in 文件

.in 文件需要手动创建,.out 文件则不需要手动创建,因为运行程序后会自动生成。
Windows 系统中创建 .in 文件比较简单,右键点击空白处,选择新建文本文件即可。
NOI Linux 系统与 Windows 系统差别较大,在 NOI Linux 系统中,右键点击空白处无法创建文本文件。可用下面三种方式来创建。
第一种,运行代码后,会生成 xxx.out 文件比如 airplane.out,然后把 airplane.out 在同一目录下复制粘贴,会生成 airplane(复件).out,将 airplane(复件).out 重命名为 airplane.in。
第二种,点击桌面左下角的“九个点”按钮,在弹出的界面中的第一页选择“文本编辑器”,注意文件要保存到程序项目的路径下。
notion image
第三种,在终端里进入程序项目所在的路径,然后用 touch airplane.invim airplane.in 的命令来创建 airplane.in 文件。
推荐使用最方便的第三种。

文件名都是小写

根据历年 CSP-J/S 和 NOIP 相关的比赛来看,输入文件名、输出文件名、以及源代码的文件名称都是小写的。

输出格式

如果题目要求数据之间加空格,那就不能换行输出。比如要求输出以下内容:
如果以下面的形式输出,则不能得分:
大小写也要注意,需要仔细看清题目是要求全大写、全小写还是首字母大写。比如要求输出 Yes,那么输出 YES、yes、yES 等均不能得分。

代码只能评测一次

我们用 OJ 练习时,可能会在每写出一版代码时先提交上去,再根据结果来决定是否修改。但 OI 赛制不能供你中途评测,因此最好改掉这个坏习惯。
每写若干行代码,可保存一次。这样可以避免因为意外情况比如死机重启导致写好的代码丢失。

头文件

包含常用的头文件,比如 iostream,cstdio, algorithm,或者直接包含万能头文件bits/stdc++.h。

变量名冲突

用了using namespace std;之后容易产生的问题是,有些自己的变量名比如 time、next 和 std 命名空间中的变量名冲突,而且在 Windows 下编译器不报错,但是在 Linux 下报错。所以如果需要这几个单词,可以使用首字母大写 Time、Next;或者做一下变形,比如 tim、nxt;或者定义成局部变量。另外 time、next 等作为结构体的成员名是没问题的。
全局变量不要使用 y0、y1、yn、j0、j1、jn。因为这些变量名称在 C++11 标准库里被定义了,不能再用作全局变量,否则编译会有警告或出错。但是这些变量可以用作局部变量。
notion image

变量初始化

变量的初始化常见有两种方式:输入和赋值。在使用变量之前记得要初始化。如果定义成全局变量,则系统会自动初始化。

数组建议用全局数组

全局数组可用的内存空间比局部数组可用的内存空间大很多很多。

注意时间和空间限制

1 秒内最大循环次数不要超过 1 亿次。1 亿次有可能超时也有可能不超时。但是 1000 ~ 2000 万次通常不会超时。
通常题目会限制内存不能超过 256MB 或 512MB,所以要学会估计内存。比如全局数组 int a[1000000] 占内存 1000000*4/(1024*1024)MB ≈ 4MB。
全局数组的大小通常最好不要超过 1000 万。在 CSP-J 2023 第二轮的第一大题中,最大的测试数据是 10 亿,有人把数组开到了 10 亿从而爆零,这是 2023 年入门级爆零人数偏多的重要原因之一。这里咱们估算一下 10 亿数组所占的内存空间,假如数组类型是布尔类型,即 bool a[1000000000],则占内存 1000000000*1/(1024*1024) ≈ 1000MB ≈ 1GB,这已超过题目的要求(512MB)一倍。如果是定义成 32 位整型,即 int a[1000000000],则占内存约 4GB。

📎 参考资料

【1】CCF非专业级别软件能力认证(CSP-J/S 2024)第二轮认证上海通知
【2】CodeBlocks安装与使用入门
相关文章
线上课 #17:栈与队列
Lazy loaded image
『社团英雄纪念碑』上线
Lazy loaded image
线上课 #12:选择排序与插入排序
Lazy loaded image
『林桛杨高』Demo 带你漫游杨高
Lazy loaded image
Git - 最优雅的分布式版本控制系统
Lazy loaded image
线上课 #11:算法复杂度与排序算法入门
Lazy loaded image
DrimTech 祝大家 1024 程序员节快乐DrimTech Online Judge 上线投入使用
Loading...
DrimTech
DrimTech
一群热爱信息技术,善于创造的羊羔
最新发布
线上课 #18:研究性学习开题仪式 & 如何科学地提问
2025-1-14
线上课 #17:栈与队列
2025-1-13
『林桛杨高』Demo 带你漫游杨高
2025-1-9
直面挑战,追求卓越——DrimTech 2024
2024-12-31
DrimTech 祝大家 1024 程序员节快乐
2024-12-31
邮箱添加别名教程
2024-12-29
公告
🎉 DrimTech 研究性学习正式开题! 🎉
2025 年 1 月 11 日,DrimTech 线上课 #18:研究性学习开题仪式 & 如何科学地提问顺利开展,宣告首次研究性学习拉开帷幕。