算法训练 区间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。

代码

#include <stdio.h>
#include <stdlib.h>
int main() {
int n,i,m,j;
scanf("%d",&n);
int a[n];
for(i=1;i<=n;i++)
scanf("%d",&a[i]);
scanf("%d",&m);
int l[m],r[m],K[m];
for(j=1;j<=m;j++)
{
scanf("%d %d %d",&l[j],&r[j],&K[j]);
}
for(j=1;j<=m;j++)
{
int b=l[j],c=r[j],d=K[j];
int a1[n];
for(i=1;i<=n;i++)
a1[i]=a[i];
for(i=b;i<c;i++)
{
int i1,temp;
for(i1=b;i1<c-(i-b);i1++)
{
if(a1[i1]<a1[i1+1])
{
temp=a1[i1];
a1[i1]=a1[i1+1];
a1[i1+1]=temp;
}
}
}
printf("%d\n",a1[b+d-1]);
}
return 0;
}

思考

这道题不难,但因为我懒癌犯了。。活生生拖了几天(中间还摸鱼看live我有罪dbq)

我想的很简单,全放数组然后每次一个冒泡排序完事

这里马一下冒泡排序边界:for1 [0,n) 【相当于n-1次循环】 for2 [0,n-i)【相当于n-i次循环】数组交换顺序(t=i;i=i+1;i+1=t;)

需要注意小地方,比如这里每次询问排序都基于初始数组,所以需要再建一个a1[n]作临时排序,保证初始输入数组a[n]不会改变

posted @ 2020-02-10 11:18  Shawuila  阅读(115)  评论(0编辑  收藏  举报