程序书海码农的世界程序员

蓝杯二十八

2018-01-24  本文已影响21人  逍遥_9353

算法训练 区间k大数查询 

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

提交此题  锦囊1  锦囊2

问题描述

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

using namespace std;

int main()

{

    int number;

    cin >> number;

    int numbers[100000];

    for ( int i = 1; i <= number; i++)

    {

        cin >> numbers[i];

    }

    int round;

    cin >> round;

    int temp;

    int numbersTemp[100000];    //替换数组

    for (int  i = 1; i <= round; i++)

    {

        int a, b, c;        区间[a,b]内,查询第c大的数。

        cin >> a >> b >> c;

  for (int i = a; i <= b; i++)

        {

            numbersTemp[i - a + 1] = numbers[i];

            // 将numbers中需要查询的段 存放进替换数组中 从1开始

        }

        //接下来是冒泡排序法

        for (int j = 1; j <= b - a + 1; j++)

        {

            for (int m = 1; m <= b - a + 1 - j; m++)

            {

                if (numbersTemp[m] < numbersTemp[m + 1])

                {

temp = numbersTemp[m];

                    numbersTemp[m] = numbersTemp[m + 1];

                    numbersTemp[m + 1] = temp;

                }

            }

        } 

        //输出第c大的数。

        cout << numbersTemp[c] << endl;

    }

        return 0;

}

蓝杯二十八 蓝杯二十八 蓝杯二十八
上一篇 下一篇

猜你喜欢

热点阅读