洛谷 1090 合併果子

2021-08-07 17:29:07 字數 988 閱讀 7938

@合併果子

有n堆果子,第i堆果子數量為c[i]。每次合併操作能合併任意兩堆果子a與b,消耗的能量為c[a]+c[b]。

目標是不斷進行合併操作將所有果子合併為一堆,求出如何才能使消耗的能量最小。

輸入第一行為果子堆數n

輸入第二行有n個整數,表示第i堆果子的數量

輸出有一行,消耗的最小能量(保證結果小於2^31)

這題應該使用貪心來解,證明如下:

設果子編號為1-n,並按順序合併,則:

第一堆果子被合併了n-1+0次

第二堆果子被合併了n-2+1次

第三堆果子被合併了n-3+1次

…你可以用手指頭模擬試試…

第n堆果子被合併了n-n+1次

所以 當i>1時 第i堆果子被合併了n-i+1次

當i=1時 第i堆果子被合併了n-i+0次

可見,合併次序越靠前的果子堆被合併的次數越多,造成的能量消耗也就越多

而合併次序越靠後的果子堆被合併的次數越少,造成的能量消耗也就越少

那麼:如果果子堆a的果子數量大於果子堆b的果子數量,且a在b前被合併,我們就應當將他們的合併順序對調

不斷執行上述操作,我們就會得出乙個果子數量遞增的序列

因此,我們應該按照果子數量從小到大合併果子堆

既然我們要不斷地取出果子堆中最小的兩堆進行合併,那麼我們就可以用二叉堆(優先佇列)來儲存果子堆,這樣時間複雜度就降到了o(nlogn)。

#include 

#include

#include

using

namespace

std;

struct int

}node;

int main()

while(que.size()>1)

printf("%d", result);

return

0;}

洛谷1090 合併果子

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

洛谷 1090 合併果子(貪心)

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

洛谷 P1090 合併果子

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