B3842 [GESP202306 三级] 春游
解题思路
这道题目要求找出未到达集合地点的同学编号。已知班级有N位同学,编号从0到N-1,M次报数中可能包含重复报数,需要确定哪些编号从未被报出过。
方法思路
-
标记数组法:使用一个标记数组
vis来记录哪些编号已经被报出过。数组的索引代表同学编号,数组的值表示该编号是否被报出过(1表示已报出,0表示未报出)。 -
输入处理:
-
首先读取同学总数
N和报数次数M。 -
然后读取
M个报出的编号,每读取一个编号x,就将vis[x]标记为1。
-
-
查找未到达同学:
-
遍历所有可能的编号(从0到N-1),检查
vis[i]是否为0。如果是0,说明该编号未被报出过,即同学未到达。 -
统计未到达同学的数量
sum。如果sum为0,说明所有同学都到达了,输出N;否则输出所有未到达同学的编号。
-
这种方法的时间复杂度为O(N + M),因为需要遍历所有报数记录进行标记,然后遍历所有编号进行检查。
#include<bits/stdc++.h> using namespace std; int n,m; int vis[1005]; // 标记数组,记录哪些编号被报出过 int main() { cin >> n >> m; // 读取同学总数N和报数次数M for(int i = 1; i <= m; i++){ // 循环处理M次报数 int x; cin >> x; // 读取当前报出的编号x vis[x] = 1; // 将vis数组中x对应的位置标记为1,表示该编号已被报出 } int sum = 0; // 统计未到达同学的数量 for(int i = 0; i < n; i++) // 遍历所有可能的编号(0到N-1) { if(vis[i] == 0){ // 如果当前编号i未被报出过 cout << i << " "; // 输出未到达的编号 sum++; // 未到达同学数量加1 } } if(sum == 0) cout << n; // 如果所有同学都到达了,输出N return 0; }

浙公网安备 33010602011771号