【问题描述】
老师带领同学们春游。已知班上有�位同学,每位同学有从0到�−1的唯 一编号。到了集合时间,老师确认是否所有同学都到达了集合地点,就让同学们 报出自己的编号。到达的同学都会报出的编号,不会报出别人的编号,但有的同 学很顽皮,会多次报出。你能帮老师找出有哪些同学没有到达吗?
【输入描述】
输入包含2行。第一行包含两个整数�和�,表示班级有�位同学,同学们 共有�次报出编号。约定2≤�,�≤1000。
第二行包含�个整数,分别为�次报出的编号。约定所有编号都在合理范围 内。 【输出描述】 输出一行。如果所有同学都到达,则输出�;否则由小到大输出所有未到达 的同学编号,空格分隔。
【样例输入1】
3 3
0 2 1
【样例输出1】
3
【样例输入2】
3 5
0 0 0 0 0
【样例输出2】
1 2
【解题思路】
1. 使用arrive数组来记录每个同学是否到达,初始为false,表示没有到达。
2. 每有一个同学报出编号,就将arrive数组对应的编号改为true。
3. 遍历arrive数组,将数组中对应位置为false的下标输出并特判所有人均到达 的情况。
【考纲知识点】循环结构(一级),模拟法、一维数组(三级)
【参考程序】
#include <iostream>
using namespace std;
bool arrive[1000];
int main() {
int n = 0, m = 0;
cin >> n >> m; //初始化arrive数组为所有同学均未报到
for (int i = 0; i < n; i++)
arrive[i] = false; //依次报到m次
for (int i = 0; i < m; i++) {
int code = 0;
cin >> code;
arrive[code] = true;
} //依次检查n位同学是否到达
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;
}