@合併果子
有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次合併之後,就只剩下一堆了。多多在合併果子時總共消耗的體力等於每次合併所耗...