總時間限制: 10000ms 單個測試點時間限制: 1000ms 記憶體限制: 65536kb
描述
給定乙個陣列,統計前k大的數並且把這k個數從大到小輸出。
輸入第一行包含乙個整數n,表示陣列的大小。n < 100000。
第二行包含n個整數,表示陣列的元素,整數之間以乙個空格分開。每個整數的絕對值不超過100000000。
第三行包含乙個整數k。k < n。
輸出從大到小輸出前k大的數,每個數一行。
樣例輸入
104 5 6 9 8 7 1 2 3 0
5
樣例輸出
98765
分析:按照快速排序的思想,把陣列前k大的數放到陣列末尾。然後在對陣列末尾k個元素做排序再輸出該部分元素。
1 #include2 #include34int a[100010];5
6int cmp(const
void *a,const
void *b)7 8
9//將a陣列下標區間[start,end]前k大的數放到陣列下標在[start,end]範圍的末尾部分.
10void findmaxk(int a,int start,int end,int
k)11
21 a[i]=key;
22if(end-i+1==k) return;//
陣列後半段的元素個數為end-i+1,剛好夠k個
23else
if( end-i+1 > k) findmaxk(a,i+1,end,k);//
陣列後半段的元素個數多於k個
24else findmaxk(a,start,i-1,k-(end-i+1) );//
陣列後半段元素個數不夠k個。所以要在前半段繼續尋找k-(end-i+1)這麼多個。 25}
26int
main()
27
c ++版:(北大郭煒老師)
1 #include 2 #include 3 #include 4using
namespace
std;56
int a[100010];7
8void swap(int & a,int &b)
9 10
11//
將a陣列下標區間[start,end]前k大的數放到陣列下標在[start,end]範圍的末尾部分.
12void findmaxk(int a,int start,int end,int
k)13
23if(end-i+1==k) return;//
陣列後半段的元素個數為end-i+1,剛好夠k個
24else
if( end-i+1 > k) findmaxk(a,i+1,end,k);//
陣列後半段的元素個數多於k個
25else findmaxk(a,start,i-1,k-(end-i+1) );//
陣列後半段元素個數不夠k個。所以要在前半段繼續尋找k-(end-i+1)這麼多個。 26}
27int
main()
28
輸出前k大的數
010 輸出前k大的數 總time limit 10000ms 單個測試點時間限制 1000ms memory limit 65536kb description 給定乙個陣列,統計前k大的數並且把這k個數從大到小輸出。input 第一行包含乙個整數n,表示陣列的大小。n 100000。第二行包含n...
輸出前k大的數
總時間限制 10000ms單個測試點時間限制 1000ms記憶體限制 65536kb noi 描述給定乙個陣列,統計前k大的數並且把這k個數從大到小輸出。輸入第一行包含乙個整數n,表示陣列的大小。n 100000。第二行包含n個整數,表示陣列的元素,整數之間以乙個空格分開。每個整數的絕對值不超過10...
C 輸出前K大的數
總時間限制 10000ms 單個測試點時間限制 1000ms 記憶體限制 65536kb 描述給定乙個陣列,統計前k大的數並且把這k個數從大到小輸出。輸入第一行包含乙個整數n,表示陣列的大小。n 100000。第二行包含n個整數,表示陣列的元素,整數之間以乙個空格分開。每個整數的絕對值不超過1000...