3401 資料結構實驗之排序四 尋找大富翁

2021-09-10 10:05:50 字數 1411 閱讀 2792

time limit: 200 ms memory limit: 512 kib

submit

statistic

discuss

problem description

2015胡潤全球財富榜調查顯示,個人資產在1000萬以上的高淨值人群達到200萬人,假設給出n個人的個人資產值,請你快速找出排前m位的大富翁。

input

首先輸入兩個正整數n( n ≤ 10^6)和m(m ≤ 10),其中n為總人數,m為需要找出的大富翁數目,接下來給出n個人的個人資產,以萬元為單位,個人資產數字為正整數,數字間以空格分隔。

output

一行資料,按降序輸出資產排前m位的大富翁的個人資產值,數字間以空格分隔,行末不得有多餘空格。

sample input

6 3

12 6 56 23 188 60

sample output

188 60 56
hint

請用堆排序完成。 

source

xam一開始照著書敲的最大堆,建立最大堆再輸出m個元素,出現了兩個錯誤,乙個記憶體將陣列a[10000]擴大至a[1000000]即可解決,還有乙個超時的錯誤本以為輸入c++輸入加速語句可以解決,結果還是因為規模的問題沒有解決,參考了

的文章後按照這個思路來寫可以解決超時。個人理解這一方法其實是在縮小規模,先建立乙個最小堆,在對最小堆反向排序為最大堆,再輸出最大堆的a[1],a[2]...a[m]即可,而非正常建立最大堆一次次維護輸出。先對前m個元素建立最小堆,再加入n-m個元素,不停維護堆。繼續通過乙個for迴圈,控制堆元素數目heap_size,使得最小堆逐步變成最大堆,這兒需要理解堆排序元素輸出的本質,以最小堆為例,其輸出的本質是把堆頂元素與堆最後乙個葉子結點的元素進行交換,交換後heap_size減一,對堆進行重新的維護,便實現了堆頂元素的輸出。輸出的本質便是將堆頂元素放置在最後乙個葉子結點上,每一次維護都能確保最小的元素在堆頂,繼而放置到最後乙個葉子結點,再將葉子結點斷裂(通過heap_size-1來實現)。

**如下,還有為什麼要先建立m個元素的堆仍有疑問

#include using namespace std;

int a[1000000];

int heap_size=0;

void swap(int &a,int &b)

void insert(int x)

else

}}//對於堆中的元素進行調整?

int main()

for(int j=m; j>x;

if(x>a[1])

}for(int l=m; l>=1; l--)

for(int k=1; k<=m; k++)

else if(k==m)

}return 0;

}

OJ3401資料結構實驗之排序四 尋找大富翁

problem description 2015胡潤全球財富榜調查顯示,個人資產在1000萬以上的高淨值人群達到200萬人,假設給出n個人的個人資產值,請你快速找出排前m位的大富翁。input 首先輸入兩個正整數n n 10 6 和m m 10 其中n為總人數,m為需要找出的大富翁數目,接下來給出n...

資料結構實驗之排序四 尋找大富翁

time limit 150ms memory limit 512k 有疑問?點這裡 2015胡潤全球財富榜調查顯示,個人資產在1000萬以上的高淨值人群達到200萬人,假設給出n個人的個人資產值,請你快速找出排前m位的大富翁。首先輸入兩個正整數n n 10 6 和m m 10 其中n為總人數,m為...

資料結構實驗之排序四 尋找大富翁

由於這道題既要求時間,又要求記憶體,所以我們可以建造乙個只含m個元素的小頂堆,剩下的n m個元素與小頂堆的第乙個元素比較,若大於小頂堆的根元素,就將其替換掉,然後將其重新調成小頂堆,重複上述過程,直至將n m個元素比較完,此時原來的小頂堆就變成乙個大頂堆。如下 include int a 15 vo...