



一、🎒 故事背景:春游点名危机!
👩🏫老师带着同学们去春游啦!
班上有 n 个同学,每个人都有一个编号:
0, 1, 2, 3, ..., n-1
到了集合时间,老师开始点名!
但是......😵
有的同学很调皮:
👉 有人会 重复报名字
👉 有人 根本没来!
老师着急地说:
"谁没到?快帮我找出来!"
二、🧠 我们的任务
👉 输入:
-
n(总人数)
-
m(报数次数)
-
m 个编号(谁喊了名字)
👉 输出:
-
如果 全来了 👉 输出 n
-
否则 👉 输出 没来的同学编号(从小到大)
三、🏗️ 思路(用故事理解!)
1、🌟 第一步:准备"签到本"
我们准备一个数组:
bool arrive[1000];
🎯含义:
👉 arrive[i] = false 👉 同学 i 还没来
👉 arrive[i] = true 👉 同学 i 已经到了
2、🌟 第二步:初始化(全部没来)
for (int i = 0; i < n; i++)
arrive[i] = false;
🧠就像老师说:
"我先假设大家都没到!"
3、🌟 第三步:听同学报数
for (int i = 0; i < m; i++) {
int code;
cin >> code;
arrive[code] = true;
}
🎯意思:
👉 谁报名字,就标记为"来了"
就算有人喊了 10 次:
👉 还是只算来了一次 ✔
4、🌟 第四步:检查谁没来
bool all = true;
for (int i = 0; i < n; i++) {
if (!arrive[i]) {
// 说明没来
}
}
🧠我们一个个检查:
👉 "0号来了吗?"
👉 "1号来了吗?"
👉 ......
5、🌟 第五步:输出结果
🎯情况1:有人没来
if (!arrive[i]) {
cout << i;
}
👉 输出没来的编号
🎯情况2:全来了!
if (all)
cout << n;
🎉输出总人数 n!
四、💻 参考代码
#include <iostream>
using namespace std;
bool arrive[1000];
int main() {
int n, m;
cin >> n >> m;
// 初始化:全部没来
for (int i = 0; i < n; i++)
arrive[i] = false;
// 记录报到
for (int i = 0; i < m; i++) {
int code;
cin >> code;
arrive[code] = true;
}
// 检查谁没来
bool all = true;
for (int i = 0; i < n; i++) {
if (!arrive[i]) {
if (all) {
cout << i;
all = false;
} else {
cout << " " << i;
}
}
}
// 如果全来了
if (all)
cout << n;
cout << endl;
return 0;
}
五、🎯 举个例子(加深理解)
1、🌟输入:
3 5
0 0 0 0 0
👉 只有 0号一直喊 😂
2、🧠分析:
| 同学 | 状态 |
|---|---|
| 0 | 来了 |
| 1 | ❌没来 |
| 2 | ❌没来 |
3、🎯输出:
1 2
六、🏆 知识点总结
✨ 用数组记录状态
✨ 去重(重复报数不影响)
✨ 遍历检查
✨ 条件输出
✨ 模拟真实问题