分清错在哪,才知道怎么改
这一课只练一件事:模拟赛结束、看到失分之后,先做——判断这处失分属于读题错(看漏或看错题目条件)、算法错(方法本身不对)、实现错(思路对但代码写错)、(没测最小或最大等边界)还是时间错(没能在规定时间内完成)中的哪一种;再给这一类写一条;最后挑一道用得上这条改法的题一遍,验证改法是否真的有效。必会:能把每处失分分类到五种错误之一;能给每一类写一条具体、下次能照做的改法。最小示例:模拟赛的 T2 提交后只过了 40% 的测试点——重新跑一遍样例和几组边界数据后发现,样例和 n=1 都正确,但 n 取到题目允许的最大值时输出少了最后一个元素;定位到代码里数组下标从 1 开始却写成了从 0 开始,最后一个元素被漏算。这属于实现错(思路没问题,是写代码时的具体失误),改法是“写循环前先在纸上画出下标范围,和数组大小对一遍”,然后挑一道用到同类下标的题重做一次,确认这次没有再漏算。边界是不能把说不清原因的失分笼统地归为“粗心”,也不能写完分类就结束、不落到具体改法上。建议掌握:时间不够复盘完所有题时,优先给丢分最多的几道题分类、写改法。拓展:拿不准一处失分具体属于哪一类时,要如实标注“暂不确定”,留到下次复盘或请教时再确认,而不是随便选一个类别凑数。这里不会在浏览器里运行 C++。
任务 1:先选出该怎么开始
先确定看到一处失分后该先做什么,再确定分类之后该怎么处理。点不认识的词可看基础解释。
必会:能说出为什么要先分类再想改法;能说出分类之后要写什么。这里不会在浏览器里运行 C++,只练习选择和走过程。
模拟赛结束后,T2 只拿到部分分。复盘时第一件事应该做什么?先做什么 · 必会
给这处失分分类之后,应该怎么处理?分类之后 · 必会
任务 2:按找错、归类、写改法三步稳步推进
最小示例:模拟赛的 T2 提交后只过了 40% 的测试点。按顺序点三步:先,再,最后写并关键题。这里不会在浏览器里运行 C++。
必会:能解释每一步为什么这样做。边界:不要跳过“找错”直接猜一个分类;每归类完一处都要落到具体改法上,不能只贴标签就结束。
- // 模拟赛复盘:T2 提交后只过了 40% 的测试点
- // 找错:重新跑一遍样例和几组边界数据,看在哪组开始出错
- // 归类:定位到“数组下标从 1 写成从 0,导致最后一个元素漏算” → 实现错
- // 写改法并重做:写循环前先画下标范围图,再挑一道同类题重做验证
三步走完了:错找出来了、也归到了实现错、改法写下了。现在把改法落到键盘上——重写的那一行循环里,要走到的范围就是上一轮出问题的地方。特别注意那一格,下面是只读脚手架,只留一空给你输入;这里不会在浏览器里运行 C++。
- // 复盘后重写的 T2:n 个数都是正整数,求最大值(下标从 1 开始用)
- int a[105]; // 最多 100 个数,下标从 1 开始用
- int main() {
- int n;
- cin >> n;
- if (n == 0) { cout << 0 << "\n"; return 0; } // 空数据:上一课的教训,别删
- int best = 0;
- for (int i = 1; ; i += 1) { cin >> a[i]; if (a[i] > best) best = a[i]; } // 上一轮漏算最后一个元素就是这一格写错了
- cout << best << "\n";
- return 0;
- }
for (int i = 1; i <= n; i += 1) { cin >> a[i]; if (a[i] > best) best = a[i]; } // i 从 1 走到 n,最后一个元素不会漏
任务 3:时间不够或拿不准时,怎么处理才诚实
建议掌握:如果复盘时间不够,把每一处失分都仔细分类会来不及,这时该先给里丢分最多的几道题分类、写改法。拓展:拿不准一处失分具体属于哪一类时,要如实标注“暂不确定”,留到下次复盘或请教时再确认,而不是随便选一个类别凑数。
必会 / 建议掌握 / 拓展:必会是给每处失分分类、写具体改法。建议掌握是时间不够时优先处理丢分最多的题。如实标注拿不准的分类是拓展,现在不用当硬门槛。
- // 复盘时间只剩 10 分钟,还有 T1、T2、T3 三处失分没分类
- // 正确处理:T2 丢分最多,优先给它分类、写改法,其余题目下次再补
- // T3 有一处失分拿不准是算法错还是实现错
- // 如实标注:写“暂不确定,属于算法错或实现错,留到下次复盘再确认”
先判断复盘时间不够时该怎么办:
再选出拿不准具体类别时该怎么记录:
任务 4:随机小测,看看你是否真的懂了
每次从本课题库抽出三道不同的选择题。题目与解析已通过校验,答完后看解析,不要只看分数;拿不准就回到对应任务再看一遍。