B3842 [GESP202306 三级] 春游

解题思路

这道题目要求找出未到达集合地点的同学编号。已知班级有N位同学,编号从0到N-1,M次报数中可能包含重复报数,需要确定哪些编号从未被报出过。

方法思路

  1. 标记数组法:使用一个标记数组vis来记录哪些编号已经被报出过。数组的索引代表同学编号,数组的值表示该编号是否被报出过(1表示已报出,0表示未报出)。

  2. 输入处理

    • 首先读取同学总数N和报数次数M

    • 然后读取M个报出的编号,每读取一个编号x,就将vis[x]标记为1。

  3. 查找未到达同学

    • 遍历所有可能的编号(从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;
}

 

posted @ 2025-05-20 17:13  CRt0729  阅读(299)  评论(0)    收藏  举报