3道經典的優先佇列題 附優先佇列的模板

2021-07-04 06:12:43 字數 1657 閱讀 3873

優先佇列是一種十分強大的資料結構,它保持了一種動態的有序性,對於不斷改變有入隊的操作,而又需要某種最大或最小的操作的問題是再合適不過了,通常優先佇列的實現是由最小堆或者最大堆完成的,並通過堆排序保持佇列的有序性,模擬佇列的結構,在實際比賽中要寫乙個堆排序還是要一定的時間的,但是stl中queue容器中已經可以實現優先佇列,下面以三道基本的題目來演示priority_queue的作用。

聰明的木匠

time limit: 1000ms, special time limit: 2500ms, memory limit: 32768kb

total submit users: 23, accepted users: 10

problem 10611 : no special judgement

problem description

最近,一位老木匠遇到了一件非常棘手的問題。他需要將一根非常長的木棒切成n 段。每段的長度分別為 l1 ,l2 ,…,ln ( 1≤l1 ,l2 ,…,ln ≤1000 ,且均為整數)個長度單位。 ∑li (i=1,2,…,n) 恰好就是原木棒的長度。我們認為切割時僅在整數點處切且沒有木材損失。

木匠發現,每一次切割花費的體力與該木棒的長度成正比,不妨設切割長度為 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

輸入資料的第一行為乙個整數n(2≤n≤150,000) ;

在接下來的 n 行中,每行為乙個整數 li (1≤li ≤1000) 。

output

輸出資料僅有一行,為乙個整數,表示木匠最少要花費的體力。測試資料保證這個整數不大於231 -1 。

sample input 43

5711

sample output

49 problem source

2023年河北大學程式設計競賽

最優的方法是每次切出最小的合併,顯然要使用優先佇列;

[cpp:firstline[1]] view plaincopyprint?#include #include struct cmp

};

using namespace std;

int main()

};using namespace std;

int main()

};

using namespace std;

int main()

};using namespace std;

int main()

};

using namespace std;

int main()

};using namespace std;

int main()

};priority_queue q;

這是從小到大的優先佇列;

**:

優先佇列(3道優先佇列問題)

優先佇列是一種十分強大的資料結構,它保持了一種動態的有序性,對於不斷改變有入隊的操作,而又需要某種最大或最小的操作的問題是再合適不過了,通常優先佇列的實現是由最小堆或者最大堆完成的,並通過堆排序保持佇列的有序性,模擬佇列的結構,在實際比賽中要寫乙個堆排序還是要一定的時間的,但是stl中queue容器...

優先佇列 水題

看了優先佇列的基礎用法,就做幾道題認識一下,就先做了幾道水題。題目大意 求一列數中的第k大個數,其中k值不變。解題思路 k值不變,故只需要維護佇列中後k大個數即可,詢問時在top 位置的數就是第k大,如下 include include include includeusing namespace ...

優先佇列模板題

建立乙個自定義列表 如何建立乙個註腳 注釋也是必不可少的 katex數學公式 新的甘特圖功能,豐富你的文章 uml 圖表 flowchart流程圖 匯出與匯入 你好!這是你第一次使用markdown編輯器所展示的歡迎頁。如果你想學習如何使用markdown編輯器,可以仔細閱讀這篇文章,了解一下mar...