问题描述
给定一个序列,每次询问序列中第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
个人思路:将要进行判断大小的数组的其实范围内的数赋值给另外一个数组,然后利用排序算法进行从大到小的排序,然后返回第k大的数值就好了
注意:表示其实范围的数的大小从1开始,而数组从零开始,注意转换,否则会出错
重点:排序算法,我用的是选择排序
见代码(C++):
#include<iostream>
using namespace std;
//将给定的数组进行从大到小排序
void Sort(int a[],int n) {
int i,j,k,t;
for(i=0;i<n-1;i++)
{
k=i;
for(j=i+1;j<n;j++)
{
if(a[k]<=a[j])
{
k=j;
}
}
t=a[i];
a[i]=a[k];
a[k]=t;
}
}
int getKbig(int a[],int l,int r,int k) {
int length=r-l+1;
int b[length];
int i,j;
for(i=0,j=l-1;i<length,j<r;i++,j++)
{
b[i]=a[j];
}
Sort(b,length);
return b[k-1];
}
int main() {
int n;//表示序列长度
cin>>n;
int a[n];
for(int i=0;i<n;i++)
{
cin>>a[i];
}
int m;//询问个数
cin>>m;
int result[m];
int l,r,k;
for(int i=0;i<m;i++)
{
cin>>l>>r>>k;
result[i]=getKbig(a,l,r,k);
}
for(int i=0;i<m;i++)
{
cout<<result[i]<<endl;
}
}