題目要求:
胡潤研究院的調查顯示,截至2023年底,中國個人資產超過1億元的高淨值人群達15萬人。假設給出n個人的個人資產值,請快速找出資產排前m位的大富翁。
輸入格式:
輸入首先給出兩個正整數n(≤10^6)和m(≤10),其中n為總人數,m為需要找出的大富翁數;接下來一行給出n個人的個人資產值,以百萬元為單位,為不超過長整型範圍的整數。數字間以空格分隔。
輸出格式:
在一行內按非遞增順序輸出資產排前m位的大富翁的個人資產值。數字間以空格分隔,但結尾不得有多餘空格。
輸入樣例:
8 3輸出樣例:8 12 7 3 20 9 5 18
20 18 12解題思路:
這題看上去不難,只是排序,找出前幾名大富翁就可以了。但是它難在資料龐大,最大是輸入n的數量可以達到10^6,但是要找的大富翁最多卻只有10個人。這題如果是用陣列或者鍊錶把所有資料儲存進去,再排序,這樣顯然很浪費記憶體和時間。也很可能超出題目要求的記憶體限制和時間限制。所有在這裡,我的**解題方式是先定義乙個long型別的陣列。陣列長度為10。判斷n和m的大小關係,雖然要找到前m個大富翁,但是題目有乙個測試點是輸入的人數小於m的。所有要先判斷n和m的大小。然後取小的先輸入完,填滿陣列,然後運用快排函式qsort()對陣列排序,順序從大到小。這樣陣列最後乙個元素就是m個大富翁中最小的那個了。然後再繼續輸入,每次輸入都和最後乙個元素(即數值最小的元素)比較,如果比最小的這個元素的數值大,那麼就把這個數插入到數值合適的位置(這裡合適的位置是指不改變陣列的非公升序排序),排完之後自然把最後乙個元素踢出去了。重複以上步驟,便可以找出前m位大富翁了。**實現如下:
code:
#include
#include
int cmp(const
void *a,const
void *b) //定義快排函式規則,這裡即非公升序
int main()
; scanf("%d %d", &n, &m);
int len = m < n ? m : n; //判讀陣列的長度取m還是n(取小的那個)
for(i = 0; i < len; i ++)
qsort(s, len, sizeof(long), cmp); //呼叫快排函式
for(i = len; i < n; i ++)
s[t] = x; //移動後,空出來的位置,即x插入的位置
break; //跳出迴圈}}
}}
if(len >= 1)
for(i = 1; i < len; i ++)
return
0;}
尋找大富翁
015年胡潤研究院的調查顯示,截至2014年9月,個人資產在600萬元以上高淨值人群達290萬人。假設給出n個人的個人資產值,請快速找出資產排前m位的大富翁。輸入首先給出兩個正整數n 10 6 和 m 1 0 其中 n為總人數,m為需要找出的大富翁數 接下來一行給出 n個人的個人資產值,以百萬元為單...
尋找大富翁
胡潤研究院的調查顯示,截至2017年底,中國個人資產超過1億元的高淨值人群達15萬人。假設給出n個人的個人資產值,請快速找出資產排前m位的大富翁。輸入首先給出兩個正整數n 10 6 和 m 1 0 其中 n為總人數,m為需要找出的大富翁數 接下來一行給出 n個人的個人資產值,以百萬元為單位,為不超過...
尋找大富翁
7 16 尋找大富翁 25 分 胡潤研究院的調查顯示,截至2017年底,中國個人資產超過1億元的高淨值人群達15萬人。假設給出n個人的個人資產值,請快速找出資產排前m位的大富翁。輸入首先給出兩個正整數n 10 6 和m 10 其中n為總人數,m為需要找出的大富翁數 接下來一行給出n個人的個人資產值,...