木板切割攻略(木板切割问题——贪心)
作者:哪吒游戏网 来源:哪吒游戏网 2020-08-15 16:58:29
木板切割攻略(木板切割问题——贪心),哪吒游戏网给大家带来详细的木板切割攻略(木板切割问题——贪心)介绍,大家可以阅读一下,希望这篇木板切割攻略(木板切割问题——贪心)可以给你带来参考价值。
一、问题引入
农夫约翰为了修理栅栏,要将一块很长的木块切成N块。准备切成的长度分别是L1、L2、、、,LN,未切割前的木板长度切好为切割后木板长度的总和。每次切断木板时的开销是这块木板的长度。(1 ≤ N ≤ 20000,0 ≤ Li ≤ 50000)
二、解题思路
由于N的值非常大,不可能枚举所有情况再求解,必须用一种比较高效的算法。木板的切割循序不确定,看似自由度很高木板切割攻略,是先选择切出较短的,还是切较长的。如果我们把一种完全切割后的情况列举出来,会发现可以用贪心算法

惊奇的发现,这种切法的切割费用之和 == 所有非叶子节点权值和 == 叶子节点的权值 * 深度(根节点深度为0)
即 33 = 15 + 7 + 8 + 3 = 3*2 + 4*2 + 5*2 + 1*3 + 2*3
问题转化为,已知所有的叶子节点和根节点,求叶子节点的权值 * 深度和的最小值。
显然,使权值大的深度小,权值小的深度大。于是木板切割攻略,此时的最佳切割方法应该具有如下性质:
最短版和次短板应该是兄弟节点
这一性质在切割过程中始终成立,反过来,我们可以根据这种性质建立起对应的二叉树。即每次合并最小的,合并后的值加到总费用中。(注意建立的树不唯一,但每种的结果一样,所以选其中一种就行)
由于是每次取最小和次小合并,维护一个优先队列就行
三、代码实现
1 #include2 #include 3 #include 4 using namespace std; 5 6 typedef long long LL; 7 const int maxn = 20000 + 10; 8 int n, L[maxn]; 9 10 void slove() 11 { 12 LL ans = 0; 13 14 //声明一个小值在前的优先队列 15 priority_queue<int, vector<int>, greater<int>>que; 16 for (int i = 0; i < n; i++) 17 que.push(L[i]); 18 19 //循环到只剩一块模板为止 20 while (que.size() > 1) 21 { 22 //取出最短的木板和次短的木板 23 int len1, len2; 24 len1 = que.top(); que.pop(); 25 len2 = que.top(); que.pop(); 26 27 ans += (len1 + len2); 28 que.push(len1 + len2); 29 } 30 printf("%lld\n", ans); 31 } 32 33 int main() 34 { 35 while (scanf("%d",&n) == 1) 36 { 37 for (int i = 0; i < n; i++) 38 scanf("%d", &L[i]); 39 slove(); 40 } 41 return 0; 42 }
四、总结
总结:以上内容就是针对木板切割攻略(木板切割问题——贪心)详细阐释,如果您觉得有更好的建议可以提供给哪吒游戏网小编,木板切割攻略(木板切割问题——贪心)部分内容转载自互联网,有帮助可以收藏一下。
上一篇: s4皇子攻略(英雄联盟美服S4赛季 德玛西亚皇子上单攻略)
- 1 魔兽世界 考古(魔兽世界考古毁一生?这些装备幻化和坐骑值得你去玩考古)
- 2 普罗霍洛夫(卢布危机下俄土豪大甩卖 卖完豪宅卖球队)
- 3 龙之谷手柄(《龙之谷手游》手柄怎么连接 柄连接教学攻略)
- 4 普罗霍洛夫(俄罗斯土豪准备20亿抛售篮网! 最烂老板是怎样炼成的?)
- 5 天联网(天联网信息科技有限公司怎么样?)
- 6 附魔大师(魔兽世界怀旧服附魔大师在哪 附魔大师位置分享介绍)
- 7 wow烹饪食谱(魔兽世界怀旧服烹饪极品食谱)
- 8 陶谦让徐州(陶谦三让徐州,世界上真有这样的好人吗?)
- 9 lol神圣之剑(LOL如果神圣之剑回归,谁最受益?第1:只要不瞎都能上钻石!)
- 10 陶谦让徐州(陶谦三让徐州的原因是什么?)

机械战警
坦克射击
梦道满V版
火箭精英3d免费版
太古灵诀
小小帝国无敌破解版
厉害了我的娃
乐高无限
侠影双剑九游版