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

杨校老师课堂之桶排序算法——桶标记/计数练习

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

1. 数的存在

题目描述

现在有一个包含K个整数的数组(0 < K ≤ 1000)找到其中个数超过50%的数。数组中的数大于-50且小于50。

输入描述

第一行包含一个整数K,表示数组大小;

第二行包含K个整数,分别是数组中的每个元素,相邻两个元素之间用单个空格隔开。

输出描述

如果存在这样的数,输出这个数;否则输出no。

样例

输入

3

1 2 2

输出

2

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

int main() {
    int a[105] = {0};  // 定义一个大小为105 的数组 a 并初始化为 0,用于存储数字出现的次数
    int k, t;  // k 表示输入数字的次数,t 表示输入的数字
    cin >> k;  // 从标准输入读取输入数字的次数 k

    // 输入每个数字并进行次数标记
    for(int i = 1; i <= k; i++){  // 循环 k 次,从 1 到 k
        cin >> t;  // 从标准输入读取一个整数到 t
        t = t + 50;  // 将 t 加上 50
        ++a[t];  // 将数组 a 中下标为 t 的元素值加 1
    }

    // 遍历每个桶查找出现次数超过一半数字
    for(int i = 1; i < 100; i++){  // 循环 100 次,从 1 到 99
        if(a[i] > k / 2){  // 如果数组 a 中下标为 i 的元素值大于 k 的一半
            cout << i - 50;  // 输出 i - 50
            return 0;  // 程序结束并返回 0
        }
    }
    cout << "no";  // 如果没有找到,输出 "no"
    return 0;  // 程序结束并返回 0
}

2. 一起来找k

题目描述

输入n(n<=5000)个整数,并进行从小到大排序,找到第k个位置的值并进行输出(相同大小数字只计算一次),k<=1000,正整数均小于30000。

输入描述

第一行为n和k,第二行为n个正整数的值,整数间用空格隔开。

输出描述

第k个值;若无解,则输出“NO RESULT”。

样例

输入

10 3

1 3 3 7 2 5 1 2 4 6

输出

3

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

int main() {
    int a[30005] = {0};  // 定义一个较大的数组 a 并初始化为 0,用于存储数字出现的信息
    int n, t;  // n 表示输入数字的数量,t 表示输入的数字
    cin >> n;  // 从标准输入读取输入数字的数量 n

    // 对输入的数字进行处理
    for(int i = 1; i <= n; ++i){  // 循环 n 次,从 1 到 n
        cin >> t;  // 从标准输入读取一个整数到 t
        ++a[t];  // 将数组 a 中下标为 t 的元素值加 1
    }

    int cnt = 0;  // 定义计数器 cnt 并初始化为 0
    // 遍历每一个桶对出现数字进行计数
    for(int i = 1; i <= 30000; ++i){  // 循环 30000 次,从 1 到 30000
        if(a[i]!= 0){  // 如果数组 a 中下标为 i 的元素值不为 0
            ++cnt;  // 计数器 cnt 加 1
            if(cnt == k){  // 如果计数器 cnt 等于 k
                cout << i << endl;  // 输出 i,并换行
                return 0;  // 程序结束并返回 0
            }
        }
    }
    cout << -1 << endl;  // 如果没有找到满足条件的 i,输出 -1
    return 0;  // 程序结束并返回 0
}

3. 整数去重

题目描述

给定含有n个整数的序列,要求对这个序列进行去重操作。所谓去重,是指对这个序列中每个重复出现的数,只保留该数第一次出现的位置,删除其余位置。

输入描述

输入包含两行:

第一行包含一个正整数n(1 <= n <= 20000),表示第二行序列中数字的个数;

第二行包含n个整数,整数之间以一个空格分开。每个整数大于等于10、小于等于100。

输出描述

输出只有一行,按照输入的顺序输出其中不重复的数字,整数之间用一个空格分开。

样例

输入

5

10 12 93 12 75

输出

10 12 93 75

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

int main() {
    int a[105] = {0};  // 定义一个大小为 105 的数组 a 并初始化为 0
    int n, x;  // n 表示输入数字的数量,x 表示输入的数字
    cin >> n;  // 从标准输入读取输入数字的数量 n

    // 输入数字并判断,未被标记过的数字,输出并进行标记
    for(int i = 1; i <= n; ++i){  
        cin >> x;  // 从标准输入读取一个整数到 x
        if(a[x] == 0){  // 如果数组 a 中下标为 x 的元素值为 0
            cout << x << " ";  // 输出 x,并输出一个空格
            a[x] = 1;  // 将数组 a 中下标为 x 的元素值标记为 1
        }
    }
    return 0;  // 程序结束并返回 0
}

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

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 数的存在
  • 题目描述
  • 输入描述
  • 输出描述
  • 样例
  • 输入
  • 输出
  • 2. 一起来找k
  • 题目描述
  • 输入描述
  • 输出描述
  • 样例
  • 输入
  • 输出
  • 3. 整数去重
  • 题目描述
  • 输入描述
  • 输出描述
  • 样例
  • 输入
  • 输出
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档