聰明的木匠 優先佇列

2021-08-25 14:37:40 字數 1161 閱讀 5308

一位老木匠需要將一根長的木棒切成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 分析:

3+4=7,7+5=12,12+7=19,用優先佇列比較容易解決
優先佇列:

/*c++

**標頭檔案: #include

**定義priority_queue《型別,vector《型別》,greater/less《型別》 >q//一定要有空格!greater公升序排序

**基本操作:q.top()//取隊首元素

q.pop()//出隊

q.push()//入隊

q.size()//判斷隊長

q.empty()//判斷隊是否為空 空的話返回真

q.back();//返回q的末尾元素

*/

**總覽:

#include 

#include

#include

#include

using

namespace

std;

int main()

while(q.size()!=1)

printf("%lld\n",sum);

}return

0;}

hunnu 10611 聰明的木匠 優先佇列

聰明的木匠 time limit 1000ms,special time limit 2500ms,memory limit 32768kb total submit users 58,accepted users 50 problem 10611 no special judgement prob...

51nod 1117 聰明的木匠 貪心 優先佇列

1117 聰明的木匠 基準時間限制 1 秒 空間限制 131072 kb 分值 20 難度 3級演算法題 一位老木匠需要將一根長的木棒切成n段。每段的長度分別為l1,l2,ln 1 l1,l2,ln 1000,且均為整數 個長度單位。我們認為切割時僅在整數點處切且沒有木材損失。木匠發現,每一次切割花...

聰明的木匠

一位老木匠需要將一根長的木棒切成n段。每段的長度分別為l1,l2,ln 1 l1,l2,ln 1000,且均為整數 個長度單位。我們認為切割時僅在整數點處切且沒有木材損失。木匠發現,每一次切割花費的體力與該木棒的長度成正比,不妨設切割長度為1的木棒花費1單位體力。例如 若n 3,l1 3,l2 4,...