ALGO-1 區間k大數查詢
阿新 • • 發佈:2018-11-11
/*ALGO-1 區間k大數查詢
問題描述
給定一個序列,每次詢問序列中第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),序列中的數<=10^6。*/
小結:這道題思路都在註釋中寫了,給我的啟發就是排序的時候還是用庫函式比較好一些,第一次自己寫的時候完全是自己來對陣列進行排序,不僅程式碼很多,而且效率也肯定沒有庫函式sort()高。
#include<iostream> #include<algorithm> int Function(int l,int r,int k,int arr[]); bool compare(int a,int b) //設定為從大到小來排序 { return a>b; } int main() { int n; //序列中數字的個數 std::cin>>n; int arr[n]; //序列 int i; for(i=0;i<n;i++) { std::cin>>arr[i]; //對序列進行輸入 } int m,l,r,k; // 示詢問序列從左往右第l個數到第r個數中,從大往小第K大的數是哪個 std::cin>>m; //提問m次 int result[m]; for(i=0;i<m;i++)//for迴圈,把每次的結果結果儲存到result陣列中 { result[i]=Function(l,r,k,arr); } for(i=0;i<m;i++)//將結果進行輸出 { std::cout<<result[i]<<std::endl; } return 0; } //因為要多次進行查詢,所以想到把查詢功能作為一個函式來使用 int Function(int l,int r,int k,int arr[]) { std::cin>>l; //每次都可以重新輸入l、r、k std::cin>>r; std::cin>>k; int j;//控制迴圈用 int a[r-l+1]; for(j=l;j<=r;j++) { a[j-l]=arr[j-1];//將需要的部分拿出來作為一個新的陣列 } std::sort(a,a+r-l+1,compare);//對新陣列進行排序 return a[k-1];//返回第k大的數字 }