算法训练(1)——区间k大数查询

来源:互联网 发布:akka java 简明教程 编辑:程序博客网 时间:2024/06/05 19:46

写在开头

由于学业及等等各种复杂原因,10月份起就没有更新博客了。曾经有梦想参加ACM的,无奈没有环境和队友。今年学校第一年参与蓝桥杯,抱着试一试玩一玩的心态报了名。报名到现在也有一段时间了,已经练了一些题目了,打算把这个过程记录下来,方便以后查阅,也欢迎大家留言交流。

之前没有完成的系列文章可能得往后延了,但是等眼前一系列事情告一段落之后会续上的。

这一系列都是蓝桥杯的练习题,后面的文章都会尽量统一以“问题描述——输入格式——输出格式——样例输入——样例输出——数据规模与约定——解题思路——核心代码——注释”这样的结构来写。核心代码一律使用C++语言,main函数包括了输入输出流的重定向(方便调试而已)和对核心代码中TestXXX()函数的调用,就不放出来了。

问题描述

给定一个序列,每次询问序列中第l个数到第r个数中第K大的数是哪个。

输入格式

第一行包含一个数n,表示序列长度。

第二行包含n个正整数,表示给定的序列。

第三个包含一个正整数m,表示询问个数。

接下来m行,每行三个数l,r,K,表示询问序列从左往右第l个数到第r个数中,从大往小第K大的数是哪个。序列元素从1开始标号。

输出格式

总共输出m行,每行一个数,表示询问的答案。

样例输入

5
1 2 3 4 5
2
1 5 2
2 3 2

样例输出

4
2

数据规模与约定

对于30%的数据,n,m<=100;

对于100%的数据,n,m<=1000;

保证k<=(r-l+1),序列中的数<=10^6

解题思路

由于数据量不大(不超过1000个数),所以采用暴力方法,直接排序并输出第k大的数。又由于会进行多次查询,每次查询的区间不一定相同,所以每次查询时将指定区间复制到临时数组里,对该数组使用标准库的sort函数进行排序即可。

核心代码

void KMax(int *a, int l, int r, int k){int len = r - l + 1;int *t = new int[len];for (int j = 0; j < len; j++){t[j] = a[l + j - 1];}sort(t, t + len);cout << t[len - k] << endl;delete[] t;}void TestKMax(){int m, n;cin >> n;int *a = new int[n];for (int i = 0; i < n; i++){cin >> a[i];}cin >> m;for (int i = 0; i < m; i++){int l, r, k;cin >> l >> r >> k;KMax(a, l, r, k);}delete[] a;}

注释

读入整个序列到数组a,每次把第l到r个元素复制到临时数组t中并排序,然后输出第k大的数。

标准库的sort函数包含在<algorithm>头文件中。

0 0
原创粉丝点击