尋找大富翁(C語言)

2021-08-20 11:00:39 字數 1467 閱讀 7313

題目要求:

胡潤研究院的調查顯示,截至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個人的個人資產值,...