【题目来源】
https://www.luogu.com.cn/problem/B3842
【题目描述】
老师带领同学们春游。已知班上有 N 位同学,每位同学有从 0 到 N−1 的唯一编号。到了集合时间,老师确认是否所有同学都到达了集合地点,就让同学们报出自己的编号。到达的同学都会报出自己的编号,不会报出别人的编号,但有的同学很顽皮,会多次报出。你能帮老师找出有哪些同学没有到达吗 ?
【输入格式】
输入包含 2 行。第一行包含两个整数 N 和 M,表示班级有 N 位同学,同学们共有 M 次报出编号。约定 2≤N,M≤1000。
第二行包含 M 个整数,分别为 M 次报出的编号。约定所有编号是小于 N 的非负整数。
【输出格式】
输出一行。如果所有同学都到达,则输出 N;否则由小到大输出所有未到达的同学编号,空格分隔。
【输入样例】
3 5
0 0 0 0 0
【输出样例】
1 2
【数据范围】
2≤N,M≤1000
【算法分析】
题目核心是统计哪些编号的同学没有报数,然后输出结果。
【算法代码】
#include <bits/stdc++.h> using namespace std; const int N=1e3+5; int st[N]; int n,m; int main() { memset(st,0,sizeof st); cin>>n>>m; while(m--) { int x; cin>>x; st[x]=true; } bool all=true; for(int i=0; i<n; i++) { if(!st[i]) { all=false; break; } } if(all) cout<<n<<endl; else { for(int i=0; i<n; i++) { if(!st[i]) cout<<i<<" "; } } return 0; } /* in: 3 5 0 0 0 0 0 out: 1 2 */
【参考文献】
https://www.luogu.com.cn/problem/solution/B3842
https://gesp.ccf.org.cn/101/attach/1569361659691040.pdf