算法练习-蓝桥杯练习系统-算法训练-ALGO-1 区间k大数查询

    技术2022-07-20  67

    区间k大数查询

    资源限制 时间限制:1.0s 内存限制:256.0MB

    问题描述 给定一个序列,每次询问序列中第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。

    我的答案: cpu使用:62ms 内存使用:2.460MB

    #include <iostream> #include <iterator> using namespace std; int main(){ int n = 0; cin>>n; int array[n]; for(int i = 0; i<n; i++){ cin>>array[i]; } int m = 0; cin>>m; int b[3]; for(int i = 0; i<m; i++){ cin>>b[0]>>b[1]>>b[2]; //算法主体,找到区间b[0]到b[1]的第b[2]大的数并输出 int c[n]; //std::copy(begin,end,container.begin()); std::copy(array,array+n,c); int num_in_array = b[1]-b[0]+1; int ans[num_in_array]; for(int k = 1; k<=b[2]; k++){ int maxk = c[b[0]-1]; int maxk_index = b[0]-1; for(int i = b[0]-1; i<b[1]; i++){ if(c[i]>maxk){ maxk = array[i]; maxk_index = i; } } ans[k-1]=maxk; c[maxk_index] = -1; } cout<<ans[b[2]-1]<<endl; } return 0; }
    Processed: 0.020, SQL: 9