刷題筆記33 切金條(貪心策略 堆)

2021-09-10 14:24:19 字數 1240 閱讀 3907

一塊金條切成兩半,是需要花費和長度數值一樣的銅板的。比如長度為20的 金條,不管切成長度多大的兩半,都要花費20個銅板。一群人想整分整塊金條,怎麼分最省銅板?

例如,給定陣列,代表一共三個人,整塊金條長度為10+20+30=60. 金條要分成10,20,30三個部分。 如果, 先把長度60的金條分成10和50,花費60 再把長度50的金條分成20和30,花費50 一共花費110銅板。

但是,如果先把長度60的金條分成30和30,花費60 再把長度30金條分成10和20,花費30 一共花費90銅板。

輸入乙個陣列,返回分割的最小代價。

基於哈夫曼編碼的思想, 把所有的葉結點生成一棵樹

首先構造小根堆

每次取最小的兩個數(小根堆),使其代價最小。並將它們的和加入到小根堆中

重複2過程,直到最後堆中僅能pop兩次

代價就是所有非葉結點加起來,如30+60。切割時從上往下切。

//小結:1、有virtual才可能發生多型現象

// 2、不發生多型(無virtual)呼叫就按原型別呼叫

#include

#include

#include

#include

#include

#include

using namespace std;

intlessmoney

(const vector<

int>

&arr)

int res =0;

while

(minheap.

size()

>1)

return res;

}int

main()

;//vectorarr = ;

cout <<

"sum = "

<<

lessmoney

(arr)

<< endl;

return0;

}

LeetCode刷題筆記 33 搜尋旋轉排序陣列

假設按照公升序排序的陣列在預先未知的某個點上進行了旋轉。例如,陣列 0,1,2,4,5,6,7 可能變為 4,5,6,7,0,1,2 搜尋乙個給定的目標值,如果陣列中存在這個目標值,則返回它的索引,否則返回 1 你可以假設陣列中不存在重複的元素。你的演算法時間複雜度必須是 o log n 級別。示例...

LeetCode刷題筆記 33(涉及二分查詢)

題目 搜尋旋轉排序陣列 假設按照公升序排序的陣列在預先未知的某個點上進行了旋轉。例如,陣列 0,1,2,4,5,6,7 可能變為 4,5,6,7,0,1,2 搜尋乙個給定的目標值,如果陣列中存在這個目標值,則返回它的索引,否則返回 1 你可以假設陣列中不存在重複的元素。你的演算法時間複雜度必須是 o...

Leetcode演算法刷題筆記2 棧 隊 堆

leetcode 225.用佇列實現棧 leetcode 155.最小棧 尾語相關刷題筆記部落格 競賽常用模板整理 acm icpc ccsp leetcode演算法刷題筆記1 鍊錶 leetcode演算法刷題筆記2 棧 隊 堆 leetcode演算法刷題筆記3 遞迴與回溯 leetcode演算法刷...