一塊金條切成兩半,是需要花費和長度數值一樣的銅板的。比如長度為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演算法刷...