算法训练 区间k大数查询

来源:互联网 发布:游戏礼包领取软件 编辑:程序博客网 时间:2024/05/29 06:42
算法训练 区间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 <iostream>#include <cstdio>#include<string>using namespace std;struct prut{    string NAME;string SEX;    int AGE;    int SCORE;};int main() {    int N;    cin >> N;    struct prut *a = new struct prut [N];    for(int i = 1; i <= N; i++) {cin >> a[i].NAME >> a[i].SEX >> a[i].AGE>>a[i].SCORE;    }   for(int i=1;i<=N-1;i++) {for(int j=1;j<=N-i;j++) {if(a[j].SCORE > a[j+1].SCORE) {swap(a[j],a[j+1]);}}}for(int i=1;i<=N;i++) {cout<<a[i].NAME <<" "<<a[i].SEX<<" "<<a[i].AGE<< " "<<a[i].SCORE<<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;}


0 0