首先獻上題目位址
就是這麼一道題了,目(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 次合併之後,就只剩下一堆了。多多在合併果子時總共消耗的...