藍橋杯 算法訓練 區間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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM