本文章由 WyOJ Shojo 从洛谷专栏拉取,原发布时间为 2025-10-24 09:32:57
试机注意事项
- 存储检查:先确认可以存储的盘符
- 文件保护:建立测试文件并重启,检查保护是否开放
- 编译测试:编写简单代码进行编译运行测试
考试前准备
试机结束至考试开始期间
编译标准:C++14 标准下不能使用
gets(),读取带空格的字符串使用:getline(cin, s); \/\/ 或 fgets();编辑器设置:
- 开启自动保存选项
- 修改编译参数:
-O2 -std=c++14 -static -g -Wall -Wextra -Wl,--stack=536870912占空间根据题目要求空间设置 - 注意编译警告,确保函数有返回值
代码验证:编译测试(考场未设置g++环境变量,熟练选手选做。)
g++ -O2 -std=c++14 -Wall -Wl,--stack=1000000000 a.cpp -o a.exe
考试流程
文件操作规范
#include <cstdio>
using namespace std;
int main() {
freopen("a.in", "r", stdin);
freopen("a.out", "w", stdout);
\/\/ 代码逻辑
return 0;
}
重要提醒:
freopen放在流同步前面- 用了流同步,一定不要用scanf(),
- cout不要用endl 要用"\n"
- 使用流同步时不要用
fclose - 字符输出要仔细核对,使用写字板查看
.in文件
读题审题策略
- 仔细阅读:不要节省读题时间,理解题意是得分基础
- 关注限制:注意时间、空间限制条件
- 细节把握:
- 注意上下界和特殊条件
- 仔细阅读子任务数据范围
- 策略选择:
- 通读所有题目,选择可做题先做
- 分析特殊数据,争取子任务分数
- 避免死磕难题
考试技巧
心态与策略
信息奥赛考的是心态,打好暴力提升下限,沉稳分析提升上限!
- 分任务拿分:不要死磕一个题目
- 子程序设计:根据数据范围编写子程序,在主程序中灵活调用
- 复杂度计算:分析数据范围,计算时空复杂度
数据分治技巧
\/\/ 示例:根据数据范围选择算法
if (n <= 1000) {
\/\/ 使用暴力解法
brute_force();
} else {
\/\/ 使用优化算法
optimized_solution();
}
常见问题与解决方案
初始化问题
- 算法开始时进行必要的初始化
- 将初始化代码作为算法的一部分编写
边界情况处理
- 整数溢出:中间过程可能爆
int/long long - 数据范围:关注上下界和极限情况
多测试数据注意事项
\/\/ 清空数据结构
void clear_data() {
\/\/ 使用 for 循环清空,避免 memset 误用
for (int i = 0; i <= n; i++) {
data[i] = 0;
}
}
清空要点:
- 不确定时全部清空
- 注意边界位置
- 多测时必须读完所有输入
数组管理
const int MAXN = 100000 + 10; \/\/ 多开一些空间
int arr[MAXN]; \/\/ 使用常量定义数组大小
空间计算:
- 线段树开4倍空间
- 大数组要计算总空间
- 动态开空间考虑极限情况
- STL容器注意额外空间开销
溢出防护
\/\/ 加法和乘法检查溢出
long long result = (long long)a * b; \/\/ 防止乘法溢出
int sum = a + b; \/\/ 可能溢出,考虑用 long long
\/\/ 取模操作
result = (a * b) % MOD; \/\/ 中间过程取模
变量管理
- 易混淆变量使用明确命名
- 使用注释标记重要变量
- 注意运算符的优先级,多加括号。位移运算与算术运算。算术运算更高
- 修改代码时检查所有相关位置
调试与验证
对拍策略
- 数据覆盖:测试上下界和极限数据
- 暴力验证:确保暴力解法正确性
- 减少重合:避免正解和暴力犯相同错误
RE问题排查
STL安全:
if (!container.empty()) { value = container.front(); \/\/ 判空后访问 }迭代器安全:避免在
begin()处--或end()处++数据结构完整性:考虑空节点情况
清理调试代码:提交前移除所有调试语句
实用工具
文件比较工具
FC命令使用说明
# 基本用法
fc file1.out file2.out
# 忽略大小写
fc \/c file1.out file2.out
# 以ASCII方式比较
fc \/a file1.out file2.out
# 以二进制方式比较
fc \/b file1.out file2.out
# 显示不同行的行号
fc \/n file1.out file2.out
时间检测工具
#include <iostream>
#include <ctime>
#include <iomanip>
using namespace std;
#define time_now double(clock())\/CLOCKS_PER_SEC
int main() {
double time = double(clock()) \/ CLOCKS_PER_SEC;
while (1) {
if (time_now - time > 0.8) break;
}
cout << fixed << setprecision(5) << time_now - time;
return 0;
}
空间计算工具
#include <iostream>
using namespace std;
bool STSTST;
int a[114514];
int b[30][40000];
bool EDEDED;
int main() {
cout << "USE " << (&EDEDED - &STSTST) \/ 1024.0 \/ 1024.0 << "MB" << endl;
return 0;
}
考试结束前检查
- 最后15分钟:检查文件版本是否正确
- 文件操作:确认已取消调试用的文件输入输出注释
- 编译验证:修改文件后必须重新编译测试
祝各位考生在CSP2025中取得优异成绩!

鲁ICP备2025150228号