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 3sample output12 6 56 23 188 60
188 60 56hint
請用堆排序完成。
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...