先填建模卡再写代码
这一课只练一件事:把题意拆成 ,再动手写程序。必会:分清 、用 、写出两个边界。最小示例:读入 n 和 n 个整数,输出它们的和; 1 <= n <= 1000;样例输入 3 和 1 2 3,输出 6,也就是 1+2+3=6。边界是 n=1,以及全是 0。建议掌握:先列 。图论、搜索树、状态压缩是拓展。这里不会在浏览器里运行 C++。
任务 1:先选出建模卡要记什么、已知未知怎么分
是编码前的清单。 要先分开写。点不认识的词可看基础解释。
必会:能说出建模卡先记已知、未知和目标。这里不会在浏览器里运行 C++,只练习选择和走过程。
建模卡在本课要做什么?读题卡 · 必会
已知和未知怎么分?已知未知 · 必会
任务 2:按顺序写下已知、目标、样例反推
最小示例:读入 n 和 n 个整数,输出它们的和。按顺序点三步:先写下 n 和 n 个数,再写下未知/目标:求和并输出,最后用 1 2 3 得到 1+2+3=6,并记下两个边界。这里不会在浏览器里运行 C++。
必会:能解释每一步为什么这样做。边界:不要跳过样例反推。n 最大 1000 时,一次循环大约 O(n),常见测试点能通过。
- // 已知:n 和 a[1..n]
- // 未知/目标:输出它们的和
- // 样例:1 2 3 → 1+2+3=6
- // 边界:n=1;全是 0
三步走完了,现在把建模卡落成一行代码:题目要输出 n 个数的和,sum 用来存这个和,循环已经写好,你只补里面那一行。下面是只读脚手架,只留一空给你敲键盘;这里不会在浏览器里运行 C++。
- // 建模卡:已知 n 和 a[1..n];未知/目标:输出它们的和
- int n; cin >> n;
- int a[1005];
- for (int i = 1; i <= n; i += 1) cin >> a[i]; // 先把 n 个数读进来
- int sum = 0; // 和从这里开始,初始是 0
- for (int i = 1; i <= n; i += 1) {
- // 每轮把第 i 个数加进 sum
- }
- cout << sum;
sum += a[i]; // 累加:把当前这个数加到原来的和上,不能把前面的和覆盖掉
任务 3:列出算法候选,并认出两个边界
建议掌握:先列 。这题用循环累加就够。n=1 时输入 1 和 7,输出 7;全是 0 时输出 0。图论、搜索树、状态压缩是拓展。
必会 / 建议掌握 / 拓展:必会是填建模卡、复述目标、写出两个边界。建议掌握是先列算法候选。图论、搜索树、状态压缩是拓展,现在不用当硬门槛。
- // 候选:循环累加
- // 边界 1:n=1,输入 7,输出 7
- // 边界 2:全是 0,输出 0
- // 搜索树 / 状态压缩是拓展
先选出这题该列什么算法候选:
再选出两个边界:
任务 4:随机小测,看看你是否真的懂了
每次从本课题库抽出三道不同的选择题。题目与解析已通过校验,答完后看解析,不要只看分数;拿不准就回到对应任务再看一遍。