首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >杨校老师课堂之桶排序——桶标记

杨校老师课堂之桶排序——桶标记

原创
作者头像
杨校
发布2025-07-03 09:53:40
发布2025-07-03 09:53:40
10800
代码可运行
举报
文章被收录于专栏:C++信息学奥赛C++信息学奥赛
运行总次数:0
代码可运行

一:涉及知识点:

(一)基础语法与变量类型

  1. 输入输出
    • cincout 的使用(标准输入输出流)
    • 连续读取多个变量(如 cin >> n >> m;
  2. 变量定义与初始化
    • 整型变量(int)的声明与赋值
    • 数组的静态初始化(如 int a[1005] = {0};
    • 数组越界风险(第三套代码中未检查输入 t 是否超出数组范围)

(二)数组与标记法

  1. 数组的基本操作
    • 通过下标访问数组元素(如 a[t] = 1;
    • 数组作为 “标记表” 的应用(用 0/1 表示元素是否出现过)
  2. 数组范围与边界
    • 数组下标从 0 开始(但代码中常从 1 开始使用,需注意对应关系)
    • 静态数组大小的限制(如 a[1005] 最大支持下标 1004

(三) 循环结构

  1. for 循环的基本格式
    • 初始化、条件判断、迭代三要素(如 for (int i=1; i<=n; i++)
  2. 循环嵌套的应用
    • 第三套代码中两次独立的 for 循环(分别处理输入和输出逻辑)

(四) 条件判断

  1. if 语句的使用
    • 单条件判断(如 if (a[i] == 0)
    • 逻辑判断在循环中的应用(筛选符合条件的元素)


二、专项训练

1. 签到问题

【题目描述】

老师带领10位同学去博物馆参观,这10位同学编号1~10。通过签到确定已经有8位同学到达,请输出未到达同学的编号。

【输入格式】

输入一行,8个数字,表示已经签到同学的编号

【输出格式】

输出一行,2个整数,表示未签到同学的编号,按照从小到大的顺序输出。

【输入样例】

3 2 9 10 6 4 5 7

【输出样例】

1 8

代码语言:javascript
代码运行次数:0
运行
复制
#include <iostream>

using namespace std;

int main() {
    int a[15] = {0};  // 定义数组a,用于标记1-10范围内的数字是否出现过,初始全为0
    int t;
    
    // 第一阶段:读取前10个输入,标记出现过的数字
    for (int i = 1; i <= 10; i++) {
        cin >> t;    
        a[t] = 1;  // 将输入的数字t对应的数组位置标记为1(表示出现过)
    }
    
    // 第二阶段:再读取10个输入,但此处逻辑存在问题
    // 本意可能是检查这10个输入中哪些在前10个输入中未出现
    // 但代码错误地使用了a[i](i是循环变量)而非a[t](t是当前输入)
    for (int i = 1; i <= 10; i++) {
        cin >> t;    
        if (a[i] == 0) {  // 错误:此处应检查a[t]而非a[i]
            cout << i << " ";  // 输出的是循环变量i,而非实际输入t
        }
    }
    
    return 0;
}

2. 签到问题(进阶)

【题目描述】

老师带领n(n<=1000)位同学去博物馆参观,这n位同学编号1~n。通过签到确定已经有m(1<=m<=n)位同学到达,请输出未到达同学的编号。

【输入格式】

输入共两行,第一行,两个数字n和m。

第二行,m个数字,分别表示已经签到同学的编号

【输出格式】

输出一行,若干个整数,表示未签到同学的编号,按照从小到大的顺序输出。

【输入样例】

5 3

2 4 5

【输出样例】

1 3

代码语言:javascript
代码运行次数:0
运行
复制
#include <iostream>

using namespace std;
int a[1005] = {0};  // 定义标记数组,初始化为0(所有元素未被标记)

int main() {
    int n, m, t;
    cin >> n >> m;  // 输入n(总范围)和m(待标记元素数量)
    
    // 标记阶段:将输入的m个元素在数组a中对应位置设为1
    for (int i = 1; i <= m; i++) {
        cin >> t;    
        a[t] = 1;    // 标记元素t出现过
    }
    
    // 输出阶段:遍历1~n,输出所有未被标记的元素(即未出现过的元素)
    for (int i = 1; i <= n; i++) {
        if (a[i] == 0) {  // 若元素i未被标记
            cout << i << " ";  // 输出该元素
        }
    }
    
    return 0;
}

3. 签到问题(改进)

【题目描述】

老师带领n(n<=1000)位同学去博物馆参观,这n位同学编号1~n。

通过签到确定已经有m(1<=m<=n)位同学到达,请输出到达同学的编号。

【输入格式】

输入共两行,第一行,两个数字n和m

第二行,m个数字,分别表示已经签到同学的编号

【输出格式】

输出一行,若干个整数,表示签到同学的编号,按照从小到大的顺序输出。

【输入样例】

5 3

2 4 5

【输出样例】

2 4 5

代码语言:javascript
代码运行次数:0
运行
复制
#include <iostream>

using namespace std;
int a[1005] = {0};  // 定义一个长度为1005的数组,初始化为0,用于标记元素是否出现

int main() {
    int n, m, t;
    cin >> n >> m;  // 输入n(总范围)和m(待输入元素的数量)
    
    // 读取m个元素,并在数组a中标记这些元素出现过(标记为1)
    for (int i = 1; i <= m; i++) {
        cin >> t;    
        a[t] = 1;    // 将元素t对应的数组位置标记为1
    }
    
    // 遍历1到n的所有元素,输出所有被标记过的元素(即出现过的元素)
    for (int i = 1; i <= n; i++) {
        if (a[i] == 1) {
            cout << i << " ";  // 输出出现过的元素,用空格分隔
        }
    }
    
    return 0;
}

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一:涉及知识点:
    • (一)基础语法与变量类型
    • (二)数组与标记法
    • (三) 循环结构
    • (四) 条件判断
  • 二、专项训练
    • 1. 签到问题
    • 2. 签到问题(进阶)
    • 3. 签到问题(改进)
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档