算法訓練 區間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
1 2 3 4 5
2
1 5 2
2 3 2
樣例輸出
4
2
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