洛谷P1090 合併果子 題解

2021-07-24 13:46:05 字數 1042 閱讀 2466

首先獻上題目位址

就是這麼一道題了,目(keng)測(ding)很多大神都寫過,不喜勿噴~

很明顯的貪心了,每次選兩個最小的拿出來求和累加在放回去,直到只剩一堆為止

然後估計所有人一開始看到都是這樣想的(手寫的有語法錯誤請諒解哈)

for (int i=1;i<=n;i++) scanf("%d",&a[i]);

dowhile (n>1)

然後一看n到10000 我就(zhi zhang)了,於是就引入了神奇的someting

堆 大神肯定司空見慣了,如果有新手的話還是略微解釋一下

一棵二叉樹,保證根節點一定最優,其兩個孩子次優,以此類推

因為是二叉樹所以更改和刪除都是logn的。

大根堆就是根節點最大,反之亦然

再回到這題,容易發現,可以把n個數建成乙個小跟堆,每次用logn的時間取出2個最小值,累加到ans裡面,再合併放回去

要做n-1次嘛,每次logn,故複雜度為o(nlogn),也就過了,畢竟1w還是很小的,那麼下面獻上程式咯

#include 

#include

#include

using namespace std;

int f[10001];

int ans,len,n;

int get()

void remove()

}void put(intx)}

int main()

ans=0;

while (len>1)

printf("%d",ans);

return

0;}

這道題也就過了,然而是手寫堆,比較煩,容易錯什麼的,於是就有了stl庫的優先佇列這種interesting的東西,就是滿足出隊的總是最優,所以就可以寫優先佇列了,用上stl庫,加個頭檔案

#include
具體用法抱歉本蒟蒻還沒用用過,用過給大家下一題的時候補上

洛谷 P1090 合併果子

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

洛谷 P1090 合併果子

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

洛谷 P1090 合併果子

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