考场策略
- 时间分配
- 解题步骤
考试的目的: 得分
- 稳定心态,减少失误
- 考场目标:将自己能力范围内的分全部拿到
- 会做的都做对
- 不会做的都蒙对
时间分配
- 写代码前
- 拿到试卷后,至少花 5-10 分钟把试卷通读一遍,对题目的难度有整体把握(不要被旁边其他人的键盘声影响,磨刀不误砍柴工)
- 三思而后行,80%思考+20%实现
- 写代码中
- 对于没有把握的题,先把暴力的代码写出来
- 对于有把握的题,做到仔细读题,思考全面
- 写代码后
- 最后 10 分钟果断停止写代码(除非想放手一搏),做全面检查
- 文件名、字符大小写、数组空间大小限制
解题步骤
- 读题
- 构思代码
- 实现代码
- 检查
为什么要读题和构思?
为什么要花足够多的时间去读题和构思?
努力
VS
选择
花半个小时写代码,发现思路错了,慌乱之中,又花了半个小时重新写新的代码
VS
花了二十分钟读题,确定思路后,花了二十分钟写好代码
A-读题
- 仔细读题 2~3 次,(草稿纸\PDF上)画出题目中的重点。注意几点: a. 数据范围及分布 b. 极端/边界情况
- 用样例验证自己对题目的理解是否正确
B-构思代码
- 在草稿纸上推算自己的思路
- 有了思路后,用样例验证思路是否正确
- 不要尝试用从未接触过或极不熟练的算法
C-实现代码
- 对于没把握拿满分的题目,先写出暴力代码(增加安全感)
- 对于有把握的题,一遍实现,一遍思考极端、边界情况下,思路是否仍旧正确
D-检查
- 静态查错:逐行阅读自己代码,找出低级错误(变量名、清空数组、赋值、符号、复制代码未修改)
- 极端小数据:(n=0,1)代码是否漏判
- 极端大数据:代码是否存在 a. 数组越界 b. 运算溢出
E-心态爆炸?
- 碰到不会的题?
- 旁边的人敲键盘霹雳啪啦飞快?
- 考试过程中发现思路不对,代码需要推倒重写,浪费了很多时间?
深呼吸,淡定
考试就是个贪心背包的过程
- 背包容量 V = 你的能力内的最大得分
- 每道题目的完成时间 = W, 分数 = V
- 贪心目标:将每道题的分尽可能多拿到,分数最大化
骗分
定义:对于难题和不保证能做对的题,在减少失误的情况下,增加得分
面对出题人的一场稳赚不赔的赌博
常用策略
- 打表:数列类型的题目
- 找规律:小样例上找规律
- 贪心:也许能拿到动规题的部分分
- 搜索:骗分神器
- 暴力+分段
搜索
动规题和图论题不会做?
拿部分分:搜索+剪枝、搜索+记忆化
void dfs() {
if(f[当前状态]) return f[当前状态]; // 记忆化
if(当前解>全局最优解) return; // 最优性剪枝
......
for(...) {
if(......) { // 其他剪枝
标记
dfs(......);
回溯
}
}
}
Copy
暴力+分段
暴力拿不到满分,写的正解不敢保证一定对?
那就看看数据范围分布吧
if(暴力不超时 n<...)
{
暴力解法(枚举、爆搜、...)
}
else
{
不一定能拿满分的正解
}
Copy
如何分段?