輸出前k大的數

2021-09-19 10:41:48 字數 1530 閱讀 6424

010:輸出前k大的數

總time limit: 10000ms 單個測試點時間限制: 1000ms memory limit: 65536kb

description

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

input

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

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

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

output

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

sample input

104 5 6 9 8 7 1 2 3 0

5sample output98

765解題思路:

排序後再輸出,複雜度 o(nlogn)

用分治處理:複雜度 o(n+mlogm)

思路:把前m大的都弄到陣列最右邊,然後對這最右邊m個元素排序, 再輸出

關鍵 :o(n)時間內實現把前m大的都弄到陣列最右邊

引入操作 arrangeright(k): 把陣列(或陣列的一部分)前k大的 都弄到最右邊

如何將前k大的都弄到最右邊 

1)設key=a[0], 將key挪到適當位置,使得比key小的元素都在 key左邊,比key大的元素都在key右邊(線性時間完成)

2)  選擇陣列的前部或後部再進行 arrangeright操作

a > k ————對最右邊a-1個元素再進行arrangerigth(k) 

a < k ————對左邊b個元素再進行arrangeright(k-a)

#include #include #include using namespace std;

int a[100010];

void arrangeright(int s,int e,int k) //把陣列的前 k 大的元素都弄到最右邊

//處理完後,a[i] = key

int sum = e+1 - i;//陣列中從key開始往右的元素個數和

if(sum == k) //完成

return ;

else if(sum > k) //對最右邊的 sum-1 個元素再進行arrangeright(k)

arrangeright(i+1,e,k);

else if(sum < k)

arrangeright(s,i-1,k-sum); // 對左邊 b(key之前的元素個數) 個元素再進行arrangeright(k-sum)

}int main()

輸出前 k 大的數

總時間限制 10000ms 單個測試點時間限制 1000ms 記憶體限制 65536kb 描述 給定乙個陣列,統計前k大的數並且把這k個數從大到小輸出。輸入第一行包含乙個整數n,表示陣列的大小。n 100000。第二行包含n個整數,表示陣列的元素,整數之間以乙個空格分開。每個整數的絕對值不超過100...

輸出前k大的數

總時間限制 10000ms單個測試點時間限制 1000ms記憶體限制 65536kb noi 描述給定乙個陣列,統計前k大的數並且把這k個數從大到小輸出。輸入第一行包含乙個整數n,表示陣列的大小。n 100000。第二行包含n個整數,表示陣列的元素,整數之間以乙個空格分開。每個整數的絕對值不超過10...

C 輸出前K大的數

總時間限制 10000ms 單個測試點時間限制 1000ms 記憶體限制 65536kb 描述給定乙個陣列,統計前k大的數並且把這k個數從大到小輸出。輸入第一行包含乙個整數n,表示陣列的大小。n 100000。第二行包含n個整數,表示陣列的元素,整數之間以乙個空格分開。每個整數的絕對值不超過1000...