總時間限制: 10000ms 單個測試點時間限制: 1000ms 記憶體限制: 65536kb
描述
給定乙個陣列,統計前k大的數並且把這k個數從大到小輸出。
輸入
第一行包含乙個整數n,表示陣列的大小。n < 100000。
第二行包含n個整數,表示陣列的元素,整數之間以乙個空格分開。每個整數的絕對值不超過100000000。
第三行包含乙個整數k。k < n。
輸出從大到小輸出前k大的數,每個數一行。
樣例輸入
1045
6987
1230
5
樣例輸出
987
65
解法
若排序整個列表,浪費很多資源;
故可把前m大的數放在陣列右邊排序,再輸出
將前m大的移到右邊
快排方法,將a[0]放到a[i],若i=n-m+1,則該數左標比自身小,右邊比自身大,排序該數右邊即可;
若in-m+1,則查詢左邊;
#include
using
namespace std;
void
swap
(int
&a,int
&b)//交換函式
void
quicksort
(int a,
int s,
int e)
//快速排序
swap
(a[i]
,a[j]);
//發現後比前小的,swap(i,j)
while
(i<=k)
//前比後小的,前往後移
swap
(a[i]
,a[j]);
}//最後a[i]即為a[s]的正確位置
quicksort
(a,s,i-1)
;//比a[i]小的排序
quicksort
(a,i+
1,e)
;//比a[i]大的排序
}void
arrangeright
(int a,
int s,
int e,
int k)
swap
(a[i]
,a[j]);
while
(i<=key)
swap
(a[i]
,a[j]);
}//比較a[i]的位置,是否比是第n-k個元素
if(k==e-i+1)
return
;//若是,則返回
if(e-i+
1>k)
arrangeright
(a,i+
1,e,k)
;//k小,則排序k右邊比k大的,接著判斷
if(e-i+
1arrangeright
(a,s,i-
1,k-e+i-1)
;//k大,則排序k左邊比k小的,接著判斷
//直到找到第n-k大的元素,全部排序其右邊即可
}int a[
100000];
int n;
int k;
intmain()
return0;
}
001 輸出前k大的數
描述 給定乙個陣列,統計前k大的數並且把這k個數從大到小輸出。輸入第一行包含乙個整數n,表示陣列的大小。n 100000。第二行包含n個整數,表示陣列的元素,整數之間以乙個空格分開。每個整數的絕對值不超過100000000。第三行包含乙個整數k。k n。輸出從大到小輸出前k大的數,每個數一行。樣例輸...
分治專題 輸出前k大的數
給定乙個陣列,統計前k大的數並且把這k個數從大到小輸出。分治 把乙個問題分解成形式和原任務相同,但規模更小的幾個部分任務 通常是兩個部分 分別完成,或只需要選一部分完成。然後再處理完成後的這乙個或幾個部分的結果,實現整個任務的完成。把前m大的都弄到陣列的右邊,然後對最右邊的m個元素排序再輸出。o n...
輸出前k大的數
010 輸出前k大的數 總time limit 10000ms 單個測試點時間限制 1000ms memory limit 65536kb description 給定乙個陣列,統計前k大的數並且把這k個數從大到小輸出。input 第一行包含乙個整數n,表示陣列的大小。n 100000。第二行包含n...