算法训练 区间k大数查询
给定一个序列,每次询问序列中第l个数到第r个数中第K大的数是哪个。
第一行包含一个数n,表示序列长度。
第二行包含n个正整数,表示给定的序列。
第三个包含一个正整数m,表示询问个数。
接下来m行,每行三个数l,r,K,表示询问序列从左往右第l个数到第r个数中,从大往小第K大的数是哪个。序列元素从1开始标号。
1 2 3 4 5
2
1 5 2
2 3 2
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]不会改变