聪明的木匠(优先队列,思维)
一位老木匠需要將一根長的木棒切成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
5
Sample Output
19
又是一道stl的問題,而且很考驗思維。一開始做這道題,就是單純的從大的開始減,,只過了樣例。后來一想,就算是減下去的大的,也有可能大于另外的數的和,而且如果一開始,從整體往下減,情況很復雜。我們倒過來想一下,如果我們將n段木頭拼接成一整根木頭,和題意是一樣的。而且只把小的加起來就好了。并且加起來的小的也要重新加入到優先隊列中。
代碼如下:
stl真的很有用。。
努力加油a啊,(o)/~
總結
以上是生活随笔為你收集整理的聪明的木匠(优先队列,思维)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: N的倍数(抽屉原理)
- 下一篇: find the nth digit(数