洛谷 合併果子(P1090)

2021-09-27 18:05:36 字數 914 閱讀 7706

合併果子

問題分析:

根據題目描述,不禁讓我們想到了哈夫曼樹。每次從森林中選取兩棵權值較小的子樹,通過合併再放入森林(相應的兩棵子樹應從森林中刪去),直至森林中僅含有一棵樹。本題要求每次合併兩堆果子,直至合成一堆。並且要求浪費的體裡最少(果子多的堆花費的力氣多)。

問題最優解即花費的力氣最少,也就要求將數量少的堆向大的堆移動。數量越大的堆,搬動的次數越少,不也就花費的力氣越少嘛。

問題求解:

輸入初始每堆果子數量,且公升序排序(優先移動數量少的果子)

合併數量最少的兩堆果子,並且下次仍需要選取最少的兩堆

直至僅剩唯一一堆果子

即每次在一堆中找其中數量最少的兩堆。思路很簡單,每次合併完最少的兩堆,再將合併後的排一次序不就可以了嗎?但是測試會超時。

有了求解的思路,每次將合併後的再次排下序,則不難求出問題的解。

因為已經經過了第一次sort排序,序列已基本有序。因此這題的解題思路可以向希爾排序上靠,希爾排序提高效率的方法是減少待比較序列比較數量以及使序列基本有序。因此這題我們可以借助插入排序,每次合併完,將合併後的果子放入序列中的合適位置。

**示例:

#include

#include

using

namespace std;

intmain()

sort

(wt, wt+n)

;for

(int i =

1, j; i < n; i++

) wt[j-1]

= wt[0]

; sum +

= wt[0]

;}cout << sum;

return0;

}

因為經過了第一次的sort排序,序列基本有序,所以插入排序的時間複雜度是可觀的,也就不會造成測試超時問題。

洛谷 P1090 合併果子

題目描述 在乙個果園裡,多多已經將所有的果子打了下來,而且按果子的不同種類分成了不同的堆。多多決定把所有的果子合成一堆。每一次合併,多多可以把兩堆果子合併到一起,消耗的體力等於兩堆果子的重量之和。可以看出,所有的果子經過n 1次合併之後,就只剩下一堆了。多多在合併果子時總共消耗的體力等於每次合併所耗...

洛谷 P1090 合併果子

在乙個果園裡,多多已經將所有的果子打了下來,而且按果子的不同種類分成了不同的堆。多多決定把所有的果子合成一堆。每一次合併,多多可以把兩堆果子合併到一起,消耗的體力等於兩堆果子的重量之和。可以看出,所有的果子經過 n 1n 1次合併之後,就只剩下一堆了。多多在合併果子時總共消耗的體力等於每次合併所耗體...

洛谷 P1090 合併果子

題目鏈結 題目描述 在乙個果園裡,多多已經將所有的果子打了下來,而且按果子的不同種類分成了不同的堆。多多決定把所有的果子合成一堆。每一次合併,多多可以把兩堆果子合併到一起,消耗的體力等於兩堆果子的重量之和。可以看出,所有的果子經過 n 1n 1 次合併之後,就只剩下一堆了。多多在合併果子時總共消耗的...