time limit: 200ms
memory limit: 512kb
submit
statistic
problem description
2015胡潤全球財富榜調查顯示,個人資產在1000萬以上的高淨值人群達到200萬人,假設給出n個人的個人資產值,請你快速找出排前m位的大富翁。
input
首先輸入兩個正整數n( n ≤ 10^6)和m(m ≤ 10),其中n為總人數,m為需要找出的大富翁數目,接下來給出n個人的個人資產,以萬元為單位,個人資產數字為正整數,數字間以空格分隔。
output
一行資料,按降序輸出資產排前m位的大富翁的個人資產值,數字間以空格分隔,行末不得有多餘空格。
example input
6 312 6 56 23 188 60
example output
188 60 56
hint
請用堆排序完成。
author
xam
此題不能將全部n個值變成大頂堆, 記憶體和時間都不夠
而是, 利用m的元素和小頂堆來求出n個值中的m個最大值。
關於建堆時為什麼從n/2開始而不是1: 把序列看成完全二叉樹時, n/2是最後一非終端結點, 從這個開始能夠將二叉樹下半部分的最大或者最小撈上來供上半部分比較調整,若從1開始不能保證調整之後第乙個是最大或者最小。大家可以用改題的資料試試。
#include#include#includevoid heapadjust(int a, int s, int m) //調整堆 使最小的在前面
a[s] = rc;
}void heapsort(int a, int m) //給定乙個陣列建成小頂堆
int main()
heapsort(a, m);
for(i = m+1; i <= n; i++)
}for(i = m; i>1; i--) //將最小值放在最後,然後是剩餘元素求最下的過程
for(i = 1; i <= m; i++)
return 0;
}
資料結構實驗之排序四 尋找大富翁
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為需要找出的大富翁...