問題描述
給定乙個序列,每次詢問序列中第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...