ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

蓝桥杯测试题-算法训练1 区间k大数查询

2021-02-12 19:00:20  阅读:147  来源: 互联网

标签:sort 大数 int 询问 测试题 个数 蓝桥 数组 序列


蓝桥杯测试题-算法训练1 区间k大数查询

问题描述
给定一个序列,每次询问序列中第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),序列中的数<=106。
个人想法
依题意需要输入n个数,即数据可以采用数组的存储方式;要求询问序列从左往右第 l 个数到第 r 个数,从大到小第 k 个大的数是哪个;可以考虑将原序列从左往右第 l 个数到第 r 个数提取到一个新数组中,再使用sort()函数对新数组进行从大到小的快速排序,排序后新数组就是一个从大到小的序列,这样想要找出第 k 大的数就非常简单,只需按相对应的数组下标输出即可。

Tip:使用sort()函数 需要头文件 algorithm ;用法:sort(start,end,bmp),start为要排序数组的起始位置,end为结束位置;sort()函数默认升序排序,要想使其降序排序,只需自己定义一个bool类型的比较函数bmp;将函数名填入第三个参数即可;

上述想法只能解决询问一次,但试题要求的 输入格式 中要求第三行输入一个正整数m表示询问的个数,意思就是要询问m次,即要求下一次输入的l,r,k都需要输入m次;

这里就可以再次采用循环的方式来实现、利用for循环循环m次,每次输入l、r、k后都将其询问的结果存储下来(数组的方式),最后输出只需要输出存储询问结果的那个数组即可;

实现代码如下:

#include<iostream>
#include<algorithm>
using namespace std;
//stl中sort()函数默认为升序
bool bmp(int x,int y){
	return x>y;
}

int main()
{
	int n,l,r,m,k;
	cin>>n;
	int a[n];
	for(int i=0;i<n;i++){
		cin>>a[i];
	}
	cin>>m;
	int result[m];//存放最后结果
	for(int j=1;j<=m;j++){
		int index=0;//新数组下标
		cin>>l>>r>>k;
		int b[r-l+1];//存储提取到的新数据
		for(int i=l-1;i<=r-1;i++){
			b[index++]=a[i];
		}
		sort(b,b+(r-l+1),bmp);
		result[j-1]=b[k-1];		
	}
	for(int i=0;i<m;i++){
		cout<<result[i]<<endl;
	}
}

这是可以通过评测的,本人萌新小白,第一次写文章,有什么错误的地方还请大佬们指点迷津

标签:sort,大数,int,询问,测试题,个数,蓝桥,数组,序列
来源: https://blog.csdn.net/qq_45896945/article/details/113795576

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有