画状态表,追踪模拟题每一步
这一课只练一件事:先画 ,再按 逐步处理。必会:判断每一步的 、用 核对结果、写出两个边界。最小示例:存钱罐模拟,读入 n 次操作,正数表示存入,负数表示取出的金额;1 <= n <= 1000;余额不足时跳过该次取款。样例输入 3 次操作 +5 -3 -10,追踪过程 5 → 2 → 跳过,输出余额 2、跳过 1 次。边界是 n=1,以及全部因 不足被跳过。建议掌握:统计跳过次数。多账户、多币种、复杂利率是拓展。这里不会在浏览器里运行 C++。
任务 1:先选出模拟题该怎么想、分支怎么判断
是模拟题的骨架。 要先想清楚。点不认识的词可看基础解释。
必会:能说出模拟题要先画状态表、再判断分支。这里不会在浏览器里运行 C++,只练习选择和走过程。
模拟题在本课要做什么?模拟思路 · 必会
条件分支要怎么处理?条件分支 · 必会
任务 2:按事件顺序追踪状态,走一遍样例
最小示例:存钱罐模拟,读入 n 次操作,正数存入、负数取出。按顺序点三步:先写下 :余额初始为 0,再按 处理 +5 -3 -10,最后用 走一遍:5 → 2 → 跳过,并记下两个边界。这里不会在浏览器里运行 C++。
必会:能解释每一步为什么这样做。边界:不要跳过样例追踪。n 最大 1000 时,一次循环大约 O(n),常见测试点能通过。
- // 状态:balance = 0
- // 事件顺序:+5 -3 -10(按输入顺序处理)
- // 样例追踪:5 → 2 →(不足,跳过)
- // 结果:余额 2,跳过 1 次
三步走完了,现在把状态表上的判断落成一行代码:每个事件只处理一次,用 决定这次操作做还是跳过。下面是只读脚手架,只留一空给你敲键盘;这里不会在浏览器里运行 C++。
- // 状态表:balance 是余额,skipped 是跳过次数
- int balance = 0, skipped = 0;
- for (int i = 1; i <= n; i += 1) {
- int x; cin >> x; // 正数存入,负数取出,按事件顺序一个一个读
- { balance += x; }
- else { skipped += 1; } // 余额不够,跳过这次
- }
- cout << balance << " " << skipped;
if (balance + x >= 0) // 操作之后余额不为负才允许:刚好变成 0 也算够
任务 3:确定处理思路,并认出两个边界
建议掌握:统计跳过次数,认出 。n=1 时输入 +7,输出余额 7、跳过 0;全部操作都因余额不足被跳过时,输出余额 0、跳过次数等于 n。多账户、多币种、复杂利率是拓展。
必会 / 建议掌握 / 拓展:必会是画状态表、按事件顺序处理、写出两个边界。建议掌握是统计跳过次数。多账户、多币种、复杂利率是拓展,现在不用当硬门槛。
- // 思路:按状态表逐步处理,遇到余额不足就跳过
- // 边界 1:n=1,输入 +7,余额 7,跳过 0
- // 边界 2:全部余额不足,余额 0,跳过次数 = n
- // 多账户 / 多币种是拓展
先选出这题该用什么处理思路:
再选出两个边界:
任务 4:随机小测,看看你是否真的懂了
每次从本课题库抽出三道不同的选择题。题目与解析已通过校验,答完后看解析,不要只看分数;拿不准就回到对应任务再看一遍。