【51Nod - 1117 】聪明的木匠 (贪心,哈夫曼树,时光倒流)
生活随笔
收集整理的這篇文章主要介紹了
【51Nod - 1117 】聪明的木匠 (贪心,哈夫曼树,时光倒流)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題干:
一位老木匠需要將一根長的木棒切成N段。每段的長度分別為L1,L2,......,LN(1 <= L1,L2,…,LN <= 1000,且均為整數)個長度單位。我們認為切割時僅在整數點處切且沒有木材損失。
木匠發現,每一次切割花費的體力與該木棒的長度成正比,不妨設切割長度為1的木棒花費1單位體力。例如:若N=3,L1 = 3,L2 = 4,L3 = 5,則木棒原長為12,木匠可以有多種切法,如:先將12切成3+9.,花費12體力,再將9切成4+5,花費9體力,一共花費21體力;還可以先將12切成4+8,花費12體力,再將8切成3+5,花費8體力,一共花費20體力。顯然,后者比前者更省體力。
那么,木匠至少要花費多少體力才能完成切割任務呢?
Input
第1行:1個整數N(2 <= N <= 50000)?
第2 - N + 1行:每行1個整數Li(1 <= Li <= 1000)。
Output
輸出最小的體力消耗。
Sample Input
3 3 4 5Sample Output
19解題報告:
? ? 最優合并問題,夏季學期實踐課的時候做過一個類似的Fence的一個(切柵欄好像是,還是切木板來著)。需要注意的問題也都在我的那篇博客上有寫。
AC代碼:
#include <bits/stdc++.h> #define ll long long using namespace std; ll n,tmp,ans,tmpp; priority_queue<ll,vector<ll>,greater<ll> > pq; int main() {cin>>n;for(int i = 1; i<=n; i++) scanf("%lld",&tmp),pq.push(tmp); for(int i = 1; i<n; i++) {tmp = pq.top();pq.pop();tmpp = pq.top(); pq.pop();ans += tmp + tmpp;pq.push(tmp + tmpp);}printf("%lld\n",ans);return 0; }?
總結
以上是生活随笔為你收集整理的【51Nod - 1117 】聪明的木匠 (贪心,哈夫曼树,时光倒流)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: neo.exe - neo是什么进程 有
- 下一篇: neoCopy.exe - neoCop