OI/CSP 赛制注意事项汇总
2025-08-01 22:41:31
发布于:上海
OI/CSP 赛制注意事项汇总
一、文件输入输出规范
-
严格使用规定的文件名进行读写!
int main() { freopen("xxx.in", "r", stdin); freopen("xxx.out", "w", stdout); //中间正常写代码 fclose(stdin); fclose(stdout); return 0; }
-
注意:
freopen()
要写在main()
的最前面。- 提交之前查看
freopen()
是否被注释了!
二、考试题目安排建议
- CSP通常是 4 道题:
- 前两题追求满分,一定要写稳,思路简单,调试充分。
- 后两题以骗分为主,不要贪心求全分,能拿多少算多少,尽量提交部分正确代码。
三、数组使用规范
-
所有数组建议定义为 全局变量,避免栈空间爆炸。
const int N = 1e6 + 10; int a[N]; // OK
-
能开的最大全局数组容量约为:1e8(1亿)个 int
-
示例:
int a[10000][10000];
=1e4 * 1e4 = 1e8
,接近极限 -
不要轻易在函数内开大数组,如:
void solve() { int a[1000000]; // ❌ 可能爆栈 }
四、常见危险操作(一定注意)
问题 | 描述 |
---|---|
❗ 爆 int | 如 ,需要用 long long |
❗ 除以 0 | 所有除法都要判断除数是否为 0 |
❗ 死循环 | while (true) 时一定要确保能 break |
❗ 死递归 | 递归不能无限下去,应有明确终止条件 |
❗ 变量重名 | 函数内外变量、循环变量容易冲突 |
❗ 变量未初始化 | int x; 未赋初值,结果不可控 |
❗ 定义范围不清 | 变量是否会越界、负值、浮点误差?提前想清楚! |
五、数据设计与自测建议
必做的几种测试数据:
类型 | 示例 | 用途 |
---|---|---|
✅ 最小数据 | n=1 , a=0 |
检查数组是否越界,递归是否终止 |
✅ 最大数据 | n=1e5 , a[i]=1e9 |
检查是否超时、爆内存、爆int |
✅ 全相同 | 所有数相同,如[1,1,1,1] |
检查逻辑是否遗漏边界 |
✅ 特殊构造 | 正好分界/相等/不成立的条件 | 判断 if 和 else 是否都能跑到 |
✅ 全负数 / 全零 | [-1,-2,-3] , [0,0,0] |
检查符号和乘法逻辑是否正确 |
六、其他考试提醒
- 写代码前先把题目数据范围、时间限制、输入格式抄在草稿纸上思考。
- 定义变量时尽量加上注释/有意义的变量名,避免后期调试混乱。
- 文件名、数组大小、边界处理,三次检查没问题再提交。
- 保底策略:写不出可以提交暴力解,或写个循环输出样例骗分(能拿一点是一点)。
总结:新手必须牢记的几句话
-
“数组全局开、不随便写递归、不用没把握的特性。”
-
“freopen写对,文件名检查 3 遍。”
-
“前两题保分,后两题骗分。”
-
“每写完一题都自己造几个最小最大样例再提交。”
比较两份文件是否相同(可以不学)
两份文件放在同一目录下,在该目录打开终端
第一份文件名假如为1.ans,第二份文件名假如为2.ans
$lines1 = Get-Content 1.ans
$lines2 = Get-Content 2.ans
for ($i = 0; $i -lt [Math]::Min($lines1.Count, $lines2.Count); $i++) {
if ($lines1[$i] -ne $lines2[$i]) {
Write-Host "Line $($i+1) differs:"
Write-Host "File 1: $($lines1[$i])"
Write-Host "File 2: $($lines2[$i])"
}
}
这里空空如也
有帮助,赞一个