輸出前 k 大的數

2021-09-21 16:20:19 字數 1618 閱讀 3681

總時間限制: 10000ms 單個測試點時間限制: 1000ms 記憶體限制: 65536kb

描述

給定乙個陣列,統計前k大的數並且把這k個數從大到小輸出。

輸入第一行包含乙個整數n,表示陣列的大小。n < 100000。

第二行包含n個整數,表示陣列的元素,整數之間以乙個空格分開。每個整數的絕對值不超過100000000。

第三行包含乙個整數k。k < n。

輸出從大到小輸出前k大的數,每個數一行。

樣例輸入

10

4 5 6 9 8 7 1 2 3 0

5

樣例輸出

987

65

分析:按照快速排序的思想,把陣列前k大的數放到陣列末尾。然後在對陣列末尾k個元素做排序再輸出該部分元素。

1 #include2 #include3

4int 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 4

using

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...