算法第六节(第2部分(切金条)) 2021-11-25 #include #include #include #include #include #include #include #include #include using namespace std; // //test.h //test // //Created by 吴珝君 on 2018/12/31. //Copyright?2018年 闲着也是贤者. All rights reserved. // /************************************************************************/ /************************************************************************/ /* 一块金条切成两半,是需要花费和长度数值一样的铜板的。比如 长度为20的 金条,不管切成长度多大的两半, 都要花费20个铜 板。一群人想整分整块金 条,怎么分最省铜板? 例如,给定数组{10,20,30},代表一共三个人, 整块金条长度为 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铜板。 输入一个数组,返回分割的最小代价。 */ /************************************************************************/ /************************************************************************/ /* 算法思想: 要实现这个目标 :要利用哈夫曼编码 编码长度越短,代价越低*/ /************************************************************************/ classCostLessMoney { // public: int costLetestMoney(vectorv) { int sum = 0; priority_queue, greater> p; //小顶推 每次选择小的 for (int i =0; i < v.size(); i++) { p.push(v[i]); } while(p.size() > 1) { int t1 = p.top(); p.pop(); int t2 = p.top(); p.pop(); sum = t1 + t2; p.push(sum); } return sum; } }; //优先级队列 class project { public: project(int c, int p) { cost = c; profit = p; } int cost; int profit; }; class compare1 { public: bool operator()(project p1, project p2)//从大到小排列 {return p1.cost > p2.cost; // 小顶堆 } }; class compare2 { public: bool operator() (project p1, project p2)//从小到大排列 { return p1.profit < p2.profit; // 大顶堆 } }; classMoreMoney { public: intgetMoreMoney(vector v, int k, int principal) { priority_queue, compare1> costHeap; //建立小顶堆 priority_queue【算法第六节(第2部分(切金条))】, compare2>profitHeap; //建立大顶堆for (int i =0; i < v.size(); i++) { //sort(v.begin(),v.end(),compare1()); costHeap.push(v[i]); } int w = principal; for (int i =0 ; i < k ; i++) { while( !costHeap.empty() && costHeap.top().cost <= w) { profitHeap.push(costHeap.top()); costHeap.pop(); } if(!profitHeap.empty()) { w += profitHeap.top().profit ; profitHeap.pop(); } else break; } return w; }}; int main() { project p1(17,4); project p2(10,2); project p3(15,3); project p4(15,4); vector v; v.push_back(p1); v.push_back(p2); v.push_back(p3); v.push_back(p4); MoreMoney m; cout << m.getMoreMoney(v,4,13); system("pause"); return 0; } 推荐阅读 怎样用柠檬美白牙齿 如何用柠檬美白牙齿 健康夕阳红 自检老年健康三“不”标志 塔黄的功效与作用 喝杨梅酒有什么好处? 梦回长安 FreeHand设计形态各异的盛开荷花 松下电视怎样才能打开杜比音效,松下电视机为什么会出现创维模式 动脉|2亿中国人颈动脉“长斑”?4件事若还不纠正,斑块或许会越长越大 什么面霜好? 怎么提升YY会员贡献 yy会员贡献度怎么获得 家里自己清洗洗衣机用什么方法 家庭用洗衣机清洗方法 2022湖北养老金上调方案细则 2022年湖北养老金调整最新消息 红葡萄酒的制作方法和步骤 火焰纹章风花雪月怎么结婚 火焰纹章风花雪结婚条件和方法 五一广州周边自驾车一日游,有哪些好地方推荐? 买电吉他要注意什么 信用卡无力偿还银行怎么处理? 现在做什么行业最好 2021创业首选10大行业 膀胱癌|小便时多留意,如果出现这几个症状可能是膀胱癌找上你了 博世壁挂炉故障代码和解决方法 博世壁挂炉ea故障原因 第三节|第三节 快乐和幸福(12) 开学第一天(下) 远去的风筝 画解算法(1.|画解算法:1. 两数之和) (二)ES6第一节变量(let|(二)ES6第一节变量(let,const) 情节33.0 Guava|Guava RateLimiter与限流算法 4月23日海军节,我在青岛等你,一起看强大的中国海军。(如图如视频) 又是多雨的季节 我用芋圆和芋饺祝大家元宵节快乐