首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >杨校老师课堂之去重桶排序算法——桶标记应用专项题单

杨校老师课堂之去重桶排序算法——桶标记应用专项题单

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

一、知识重点

一、基础语法与数据结构

  1. 数组的定义与初始化
    • 静态数组声明:int a[105] = {0}; 定义长度为 105 的数组,初始值全为 0
    • 数组下标与元素映射:用 a[t] 标记数字 t 是否出现(t 作为下标)
  2. 输入输出处理
    • 连续读取多个变量:cin >> n >> t;
    • 格式化输出:cout << i << " "; 按要求输出数字或结果

二、核心算法思想

  1. 哈希思想(简化版)
    • 标记法:用数组下标直接映射元素值(如 a[5]=1 表示数字 5 出现过)
    • 空间换时间:通过 O (1) 时间复杂度完成元素查询与标记
  2. 统计与筛选
    • 计数统计:通过 a[t]++ 统计数字出现次数(第三套代码)
    • 补集思想:输出未被标记的元素(第二套代码)
    • 排序输出:通过控制遍历顺序实现升序 / 降序输出(第三套代码)

三、循环与条件控制

  1. for 循环的灵活应用
    • 正向遍历:从 1 到 n(输入阶段)或 1 到 100(输出阶段)
    • 反向遍历:从 100 到 1(实现降序输出)
    • 嵌套循环:多阶段处理(如先标记、后统计)
  2. 条件判断与筛选
    • if (a[i] == 0):筛选未出现的元素(第二套代码)
    • if (a[i] > max):查找最大值(第三套代码变种)


二、专项训练

1. 小可的探险计划

题目描述】

探险家小可想要绘制某个森林的路径图,已知森林里有10条路,编号为1~10,小可需要不重复的将每条路走一遍,现在已经走了其中5条。但此时的小可已经比较疲惫,不确定还有哪些路没有绘制。输入五个数,表示已经走过的路。请问还剩哪些路没有走过?

例如走过2 7 4 1 8,则请告诉他:3 5 6 9 10没有走过。

【输入格式】

输入一行,五个数字,表示已经走过的路径编号。

【输出格式】

输出一行,五个数字,表示没有走过的路径编号。

【输入样例】

2 7 4 1 8

【输出样例】

3 5 6 9 10

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

using namespace std;

int a[15] = {0};  // 定义标记数组,用于标记1-10范围内的数字是否出现过,初始全为0

int main() {
    int t;
    
    // 标记阶段:读取5个输入数字,并在数组a中标记这些数字出现过
    for (int i = 1; i <= 5; i++) {
        cin >> t;           // 读取一个输入数字
        a[t] = 1;           // 将该数字对应的数组位置标记为1(表示出现过)
    }
    
    // 输出阶段:遍历1-10的所有数字,输出未被标记的数字(即未出现过的数字)
    for (int i = 1; i <= 10; i++) {
        if (a[i] == 0) {    // 若数组位置i仍为0,说明数字i未被标记(未出现过)
            cout << i << " ";  // 输出该数字
        }
    }
    
    return 0;
}

2. 俄罗斯套娃

题目描述

本来有一个完整的俄罗斯套娃,现在被小可都拆开了,很是凌乱,现在需要你帮我按套娃的尺寸从大到小的给我,帮我一起把套娃组装起来!

输入描述

每组测试数据第一行以一个正整数n(1 <= n <= 100)开始,接下来n个正整数(代表套娃的尺寸,最大不超过100)用空格隔开。

输出描述

对于每组测试数据,输出一行,表示套娃尺寸的顺序,如有相同尺寸的套娃只需要输出一个。

样例

输入

5

4 1 3 2 3

输出

4 3 2 1

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

using namespace std;

int a[105] = {0};  // 定义标记数组,用于标记1-100范围内的数字是否出现过,初始全为0

int main() {
    int n, t;
    cin >> n;  // 输入数字的总数量
    
    // 标记阶段:读取n个输入数字,并在数组a中标记这些数字出现过
    for (int i = 1; i <= n; i++) {
        cin >> t;        // 读取一个输入数字
        a[t] = 1;        // 将该数字对应的数组位置标记为1(表示出现过)
    }
    
    // 输出阶段:从100到1倒序遍历,输出所有出现过的数字(降序排列)
    for (int i = 100; i > 0; i--) {
        if (a[i] == 1) { // 若数组位置i为1,说明数字i出现过
            cout << i << " ";  // 输出该数字,用空格分隔
        }
    }
    
    return 0;
}

3. 小可的问卷调查

题目描述

小可想要在学校给同学们做一份问卷调查,为了保证数据的真实有效,他决定用随机数的方式来选择发放问卷的人群。

他先用计算机生成了X个1到1000之间的随机整数(X≤100),之后将重复的数字去掉,只保留一个,然后找这个号码对应学号的同学们来发放问卷。

请你帮助小可将这些数字按照从小到大的顺序排列出来。

输入描述

输入共两行:

第一行为1个正整数,表示所生成的随机数的个数:X;

第二行有X个用空格隔开的正整数,为所产生的随机数。

输出描述

输出共两行:

第一行为1个正整数X,表示不相同的随机数的个数。

第二行为X个用空格隔开的正整数,为从小到大排好序的不相同的随机数。

样例

输入

10

20 40 32 67 40 20 89 300 400 15

输出

8

15 20 32 40 67 89 300 400

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

int main(){
    // 定义数组a,大小为1005,初始值全为0,用于标记数字是否出现;n用于存储输入的数量,x用于临时存储输入的数字,cnt用于统计符合条件的数字个数
    int a[1005]={0},n,x,cnt=0; 
    // 输入要处理的数字个数n
    cin>>n; 
    // 循环n次,读取n个数字并做标记
    for(int i=1;i<=n;i++){ 
        // 读取一个数字x
        cin>>x; 
        // 将数组a中对应下标x的位置赋值为1,标记该数字x出现过
        a[x]=1; 
    }
    // 循环1到100,统计数组a中下标对应位置值为1的数量(即1到100中出现过的数字个数)
    for(int i=1;i<=100;i++){ 
        // 判断数组a下标i位置的值是否为1(即数字i是否出现过)
        if(a[i]==1){ 
            // 若出现过,cnt加1,统计出现过的数字总数
            cnt++; 
        }
    }
    // 输出1到100中出现过的数字的总个数
    cout<<cnt<<endl; 
    // 再次循环1到100,输出出现过的数字(即数组a下标对应位置值为1的数字)
    for(int i=1;i<=100;i++){ 
        // 判断数字i是否出现过(数组a下标i位置值是否为1)
        if(a[i]==1){ 
            // 若出现过,输出该数字i,并用空格分隔
            cout<<i<<" "; 
        }
    }
    return 0;
}

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

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、知识重点
    • 一、基础语法与数据结构
    • 二、核心算法思想
    • 三、循环与条件控制
  • 二、专项训练
    • 1. 小可的探险计划
    • 2. 俄罗斯套娃
    • 题目描述
    • 输入描述
    • 输出描述
    • 样例
    • 输入
    • 输出
    • 3. 小可的问卷调查
    • 题目描述
    • 输入描述
    • 输出描述
    • 样例
    • 输入
    • 输出
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档