藍橋杯測試題 演算法訓練1 區間k大數查詢

2021-10-19 09:31:32 字數 1512 閱讀 1176

問題描述

給定乙個序列,每次詢問序列中第l個數到第r個數中第k大的數是哪個。

輸入格式

第一行包含乙個數n,表示序列長度。

第二行包含n個正整數,表示給定的序列。

第三行包含乙個正整數m,表示詢問個數。

接下來m行,每行三個數l,r,k,表示詢問序列從左往右第l個數到第r個數中,從大往小第k大的數是哪個。序列元素從1開始標號。

輸出格式

總共輸出m行,每行乙個數,表示詢問的答案。

樣例輸入

51 2 3 4 5

21 5 2

2 3 2

樣例輸出42

資料規模與約定

對於30%的資料,n,m<=100;

對於100%的資料,n,m<=1000;

保證k<=(r-l+1),序列中的數<=106。

個人想法

依題意需要輸入n個數,即資料可以採用陣列的儲存方式;要求詢問序列從左往右第 l 個數到第 r 個數,從大到小第 k 個大的數是哪個;可以考慮將原序列從左往右第 l 個數到第 r 個數提取到乙個新陣列中,再使用sort()函式對新陣列進行從大到小的快速排序,排序後新陣列就是乙個從大到小的序列,這樣想要找出第 k 大的數就非常簡單,只需按相對應的陣列下標輸出即可。

tip:使用sort()函式 需要標頭檔案 algorithm ;用法:sort(start,end,bmp),start為要排序陣列的起始位置,end為結束位置;sort()函式預設公升序排序,要想使其降序排序,只需自己定義乙個bool型別的比較函式bmp;將函式名填入第三個引數即可;

上述想法只能解決詢問一次,但試題要求的 輸入格式 中要求第三行輸入乙個正整數m表示詢問的個數,意思就是要詢問m次,即要求下一次輸入的l,r,k都需要輸入m次;

這裡就可以再次採用迴圈的方式來實現、利用for迴圈迴圈m次,每次輸入l、r、k後都將其詢問的結果儲存下來(陣列的方式),最後輸出只需要輸出儲存詢問結果的那個陣列即可;

實現**如下:

#include

#include

using

namespace std;

//stl中sort()函式預設為公升序

bool

bmp(

int x,

int y)

intmain()

cin>>m;

int result[m]

;//存放最後結果

for(

int j=

1;j<=m;j++

)sort

(b,b+

(r-l+1)

,bmp)

; result[j-1]

=b[k-1]

;}for(

int i=

0;i)}

這是可以通過評測的,本人萌新小白,第一次寫文章,有什麼錯誤的地方還請大佬們指點迷津

藍橋杯 演算法訓練之ALGO 1 區間k大數查詢

問題描述 給定乙個序列,每次詢問序列中第l個數到第r個數中第k大的數是哪個。輸入格式 第一行包含乙個數n,表示序列長度。第二行包含n個正整數,表示給定的序列。第三個包含乙個正整數m,表示詢問個數。接下來m行,每行三個數l,r,k,表示詢問序列從左往右第l個數到第r個數中,從大往小第k大的數是哪個。序...

試題 演算法訓練 區間k大數查詢 藍橋杯

題目描述 資源限制 時間限制 1.0s 記憶體限制 256.0mb 問題描述 給定乙個序列,每次詢問序列中第l個數到第r個數中第k大的數是哪個。輸入格式 第一行包含乙個數n,表示序列長度。第二行包含n個正整數,表示給定的序列。第三個包含乙個正整數m,表示詢問個數。接下來m行,每行三個數l,r,k,表...

藍橋杯試題集 演算法訓練 區間k大數查詢

演算法訓練 區間k大數查詢 時間限制 1.0s 記憶體限制 256.0mb 問題描述 給定乙個序列,每次詢問序列中第l個數到第r個數中第k大的數是哪個。輸入格式 第一行包含乙個數n,表示序列長度。第二行包含n個正整數,表示給定的序列。第三個包含乙個正整數m,表示詢問個數。接下來m行,每行三個數l,r...