首页 > 学院 > 开发设计 > 正文

算法训练 区间k大数查询

2019-11-08 00:50:31
字体:
来源:转载
供稿:网友
算法训练 区间k大数查询  问题描述给定一个序列,每次询问序列中第l个数到第r个数中第K大的数是哪个。输入格式第一行包含一个数n,表示序列长度。第二行包含n个正整数,表示给定的序列。第三个包含一个正整数m,表示询问个数。接下来m行,每行三个数l,r,K,表示询问序列从左往右第l个数到第r个数中,从大往小第K大的数是哪个。序列元素从1开始标号。输出格式总共输出m行,每行一个数,表示询问的答案。样例输入51 2 3 4 521 5 22 3 2样例输出42数据规模与约定对于30%的数据,n,m<=100;对于100%的数据,n,m<=1000;保证k<=(r-l+1),序列中的数<=106。别人思路#include <iostream>#include <algorithm>using namespace std;int cmp(int a, int b){return a > b;}int main() {    int n;    cin >> n;    int *a = new int [n];    for (int i = 0; i < n; i++) {        cin >> a[i];    }    int m;    cin >> m;    int *result = new int [m];    for (int i = 0; i < m; i++) {        int l,r,k;        cin >> l;        cin >> r;        cin >> k;        int *b = new int [n];        for(int j = 0; j < n; j++) {            b[j] = a[j];        }        sort(b + l - 1, b + r, cmp);//对 b数组中的第l个数~第r个数,从大到小排序        result[i] = b[l - 1 + k - 1];//此处是把第K大的数赋给result?        delete [] b;    }    for (int i = 0; i < m; i++) {        cout << result[i] << endl;    }    return 0;

}

自己思路

#include <iostream>#include <vector>#include <algorithm>#include <functional> using namespace std;int main() {int n,m;cin>>n;int a[101];for(int i=1;i<=n;i++) {cin>>a[i];}cin>>m;int l,r,k;for(int j=1;j<=m;j++) {cin>>l>>r>>k;vector <int> v;for(int i=l;i<=r;i++) {v.push_back(a[i]);sort(v.begin(),v.end(),greater<int>());} cout<<v[k-1]<<endl; //for(int b=0;b<=v.size()-1;b++) // cout<<v[b]<<" "; }return 0;}


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表