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

2021-08-13 20:28:58 字數 1336 閱讀 8501

problem description

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

input

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

output

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

example input

6 3

12 6 56 23 188 60

example output

188 60 56

hint

請用堆排序完成。

本題時間和空間要求都很高,資料也比較大,所以用堆排,需要求n個人中的m個人,就建乙個能存m個資料的最小堆,

然後用剩餘的n-m個資料與堆頂元素比較,如果當前元素比堆頂元素小,就continue,若比堆頂元素大,捨棄當前堆頂而將這個數作為新堆頂

最後,最小堆裡的元素就是n個數中前m個最大的數;

求前k個最大的數則建立k個數的最小堆

求前k個最小的數則建立k個數的最大堆

#include 

#include

using

namespace

std;

int a[20];//空間能夠存m個即可

void heapjust(int s, int m)//把a建成小堆頂

a[s] = t;

}int main()

for(i = m/2; i > 0; i--)

for(i = m+1; i <= n; i++)

}for(i = m; i > 1; i--)//將堆頂元素和當前未經排序子串行的最後乙個元素交換

for(i = 1; i <= m; i++)

printf("\n");

}

用陣列來仿堆

#include 

#include

#include

using

namespace

std;

int a[20];

int main()

for(int i = m; i < n; i++)

}sort(a, a+m);//將「堆」sort排序,從小到大的

for(int i = m-1; i >= 0; i--)

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

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

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

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