1. 程式人生 > >ALGO-1 區間k大數查詢

ALGO-1 區間k大數查詢

/*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

資料規模與約定
對於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大的數字 
}