CCSP金奖说 | 西电席若尧:与CCF系列竞赛的不解之缘
2023 CCF CCSP竞赛10月底于沈阳成功举办,西安电子科技大学席若尧同学获得金奖(第九名)。每年CSP高分考生(200分及以上)均可报名参加CCSP竞赛,CCF不定期邀请CSP高分和CCSP获奖选手分享经验,希望能够帮助同学们取得更大的进步。
非常欢迎更多CSP高分学生分享自己的宝贵经验,联系:csp@ccf.org.cn
我与CCF竞赛
因为我从小对计算机很感兴趣,初一的时候就有老师问我“CCF有个面向中学生的程序设计竞赛,你要不要参加”,我当时也没多想就去跟着当时高一的选手训练了。最后在初三、高三分别获得了NOIP普及组一等奖和提高组一等奖。
进入大学后,我在大一到研二每年都参加ICPC区域赛,最后超过了ICPC的年龄限制。此后就听说CCSP这个比赛允许研究生参赛,而且没有年龄限制,于是就参加了2020年至2023年这4届CCSP。但是2020年和2022年全国赛都是线上进行,而2021年学校由于疫情原因不组织我们参加外地的比赛,所以本届是我第一次线下参加CCSP的全国赛。
席若尧CSP认证成绩单截图
CCSP参赛体验
CCSP在一些方面与NOIP、ICPC等传统的程序设计竞赛有显著区别。
在题目方面,CCSP除了有传统的程序设计竞赛题外,通常还有系统设计题,可能还有系统优化题。CCSP线上赛通常有传统程序设计竞赛题、系统设计题、系统优化题各一道,线下赛通常有传统程序设计竞赛题2~3道,系统设计题1~2道,系统优化题0~1道。
在赛制方面,CCSP与IOI较为相似,是单人竞赛,题目有部分分,且能即时查看评测结果。
在比赛时长方面,CCSP线上赛时长为6小时,而现场赛时长高达12小时,这在我参加过的竞赛中仅次于长达24小时的IEEExtreme。
在比赛规则方面,CCSP允许携带和使用没有通信、计算功能的电子设备,这和其他有监考的程序设计竞赛大不相同。
2023 CCF CCSP竞赛颁奖会现场
备赛和参赛建议
针对传统程序设计竞赛题,要多做ICPC、CCPC、AtCoder等传统程序设计竞赛的题目,以及类型与之接近的CSP题目,熟练掌握竞赛中常用的算法和数据结构。有程序设计竞赛专门训练的选手应该在传统题中拿到满分或接近满分,其他选手也要拿到尽量较多的部分分。同时这些题目相比系统设计题和系统优化题来说代码量较少,因此要提高解决传统题目的思考和编码速度,为系统题留出尽量多的时间。
针对系统设计题,要广泛了解计算机、软件工程专业相关学科的知识,了解常见类型软件系统 (编译器、链接器、数据库等) 的基本逻辑。另外,有一些系统设计题要求修改现有系统以实现新的功能,为此要提高阅读文档和代码的能力,并尝试为一些开源项目提交修复 bug 或增加功能的补丁,以积累修改现有系统的经验。系统设计题的题目描述和论文、教科书对类似系统的描述或现有的软件实现往往存在区别,在比赛中要以题目描述为准,不要随便套文献或者开源代码中的内容 (如无绝对必要,甚至不用看题目自带的参考论文)。
针对系统优化题我也没有什么经验。往年我由于比赛策略出现问题而没有尝试系统优化题,今年的题目中则没有系统优化题。但是系统优化题往往是要求先做一道系统设计题,然后再提高系统的性能,因此至少要会做系统设计题。
对于所有类型的题目,编码速度和调试能力都是非常重要的。在平时的训练中,要熟悉Linux系统环境,学会使用编译器提供的编译期警告和运行库提供的运行时检查功能(如`-D_GLIBCXX_DEBUG`和`-fsanitize=undefined`)快速排除代码中的低级错误,学会用 GDB 的命令行界面进行交互式调试 (不建议依赖图形化工具进行调试,因为选手很可能不熟悉现场赛环境中提供的图形化调试界面)。如果提交的代码没有拿到预期分数,要会编写数据生成器和比较暴力但确保正确性的解法以进行对比测试。
针对子任务和部分分,对于传统算法竞赛题,应该先仔细思考,想出能拿最高分数的算法,然后直接写拿这个最高分数的代码,而不建议逐个子任务拿部分分 (这样会浪费时间,特别是在解决子任务的算法和出题人对该子任务的想定不一致时,该算法可能难以推广到后续子任务,结果必须全部重写,甚至使选手陷入思维误区)。对系统题就不得不编写和提交拿部分分的代码,因为直接尝试拿最高分很可能导致最后写不完或者写错而得到 0 分。但是在解决前置子问题时,只要时间不是特别紧张,也要先阅读全部子问题,并将代码写成便于后续子问题解决的形式 (例如,将后续子问题可能复用的逻辑写成一个便于调用的函数)。
由于允许携带电子设备,最好携带自己惯用的键盘,并用一个U盘存放可能用到的资料 (如整理好的竞赛用代码库)。此外如果平时习惯使用现场不提供的编辑器和工具软件,也可以把这些软件包及其依赖项存放到U盘中,用试机时间编译和/或安装 (注意现场没有root权限,所以不能带 `.deb` 包)。
最后还要调整好心态,和其他所有竞赛一样,CCSP也有运气成分,也会出现发挥不如预期的情况。例如,如果今年出一道系统优化题,我可能就会因为没有做这种题的经验,而拿到比较差的成绩。在赛前不要因为做往年题做不出来而过度焦虑,在赛后也不要因为发挥不如预期而难受太久,就算没有拿奖也可以当成低价参加一次CNCC(小编备注:参加CCSP竞赛的选手都能免费参加当年的CNCC)。
致谢
感谢CCF举办CCSP和CNCC,使得选手们能够增进知识、体验快乐,预祝下一届CCSP竞赛更加成功。
另外在此还要感谢我在中学期间的指导教练褚鹏老师、赵振宏老师,大学期间的指导教练张淑平老师,以及西电程序设计竞赛团队所有同学对我的帮助和支持。