luogu-B3842 [GESP202306 三级] 春游
GESP三级真题,一维数组相关,难度★★☆☆☆。
luogu-B3842 [GESP202306 三级] 春游
题目要求
题目描述
老师带领同学们春游。已知班上有 位同学,每位同学有从 到 的唯一编号。到了集合时间,老师确认是否所有同学都到达了集合地点,就让同学们报出自己的编号。到达的同学都会报出自己的编号,不会报出别人的编号,但有的同学很顽皮,会多次报出。你能帮老师找出有哪些同学没有到达吗 ?。
输入格式
输入包含 行。第一行包含两个整数 和 ,表示班级有 位同学,同学们共有 次报出编号。约定 。
第二行包含 个整数,分别为 次报出的编号。约定所有编号是小于 的非负整数。
输出格式
输出一行。如果所有同学都到达,则输出 ;否则由小到大输出所有未到达的同学编号,空格分隔。
输入输出样例 #1
输入 #1
3 3
0 2 1
输出 #1
3
输入输出样例 #2
输入 #2
3 5
0 0 0 0 0
输出 #2
1 2
题目分析
解题思路
- 读取输入的学生总数N和报数次数M
- 使用数组记录每个学生编号的出现情况:
- 创建大小为N的布尔数组,初始化为false
- 遍历M个报出的编号,将对应编号位置标记为true
- 检查未到达的学生:
- 遍历布尔数组
- 如果某位置为false,说明该编号学生未到达
- 输出结果:
- 如果所有学生都到达,输出N
- 否则按升序输出未到达学生的编号
复杂度分析:
- 时间复杂度为 ,其中N为学生总数,M为报数次数
- 空间复杂度为 ,需要一个大小为N的数组记录到达情况
{% include custom/custom-post-content-inner.html %}
示例代码
#include <iostream>
int main() {
// 声明变量n表示学生总数,m表示报数次数
int m, n;
std::cin >> n >> m;
// n_ary数组记录每个编号是否出现过,初始化为0
int n_ary[n] = {0};
// m_ary数组存储所有报出的编号
int m_ary[m];
// 读取所有报出的编号
for (int i = 0; i < m; i++) {
std::cin >> m_ary[i];
}
// 初始化n_ary数组为0,表示所有编号都未出现
for (int i = 0; i < n; i++) {
n_ary[i] = 0;
}
// 遍历所有报出的编号,将对应位置标记为1
for (int i = 0; i < m; i++) {
n_ary[m_ary[i]] = 1;
}
// flag表示是否所有学生都到齐
bool flag = true;
// 遍历n_ary数组,输出未出现的编号
for (int i = 0; i < n; i++) {
if (n_ary[i] == 0) {
std::cout << i << " ";
flag = false;
}
}
// 如果所有学生都到齐,输出总人数n
if (flag) {
std::cout << n;
}
return 0;
}
{% include custom/custom-post-content-footer.md %}
所有代码已上传至Github:https://github.com/lihongzheshuai/yummy-code
“luogu-”系列题目可在 洛谷题库 在线评测。
“bcqm-”系列题目可在 编程启蒙题库 在线评测。
GESP/CSP 认证学习微信公众号

Last updated on