zoukankan      html  css  js  c++  java
  • 蓝桥杯 算法训练 区间k大数查询(水题)

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


    第一遍用 排序 做的。

    具体做法是对指定的 [ l , r ] 区间进行从大到小的排序,然后输出第 l+k-1 个数,就是第k个大的数。

    注意每次查询要创建数组存储临时数组。

     1 #include <iostream>
     2 using namespace std;
     3 int main()
     4 {
     5     int a[1001];
     6     int n,m;
     7     cin>>n;
     8     for(int i=1;i<=n;i++)
     9         cin>>a[i];
    10     cin>>m;
    11     while(m--){
    12         int b[1001];
    13         int l,r,k;
    14         cin>>l>>r>>k;
    15         //赋值给新的数组,以免影响到后面的查询
    16         for(int i=l;i<=r;i++)
    17             b[i]=a[i]; 
    18         //从大到小排序 
    19         for(int i=1;i<=r-l;i++)
    20             for(int j=l;j<=r-i;j++){
    21                 if(b[j] < b[j+1]){
    22                     int t;
    23                     t=b[j];b[j]=b[j+1];b[j+1]=t;
    24                 }
    25             }
    26         cout<<b[l+k-1]<<endl;
    27     }
    28     return 0;
    29 }

    Freecode : www.cnblogs.com/yym2013

  • 相关阅读:
    离线安装SilverLight
    Singleton模式
    首次进入
    实现多层菜单(=_=!)(很傻又很土的办法)
    【转】Java中Split函数的用法技巧
    【转】来电显示
    DatePickerDialog
    Unable to resolve target 'android9'
    退出activity的另一种写法
    滚轮控件的定义和使用
  • 原文地址:https://www.cnblogs.com/yym2013/p/3509166.html
Copyright © 2011-2022 走看看