一道小学生的贪心算法题 没想明白怎么做 求大佬指点

qq_33623624 2019-08-25 09:53:01
求大佬!最好能有代码和解析
...全文
147 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
Italink 2019-09-20
  • 打赏
  • 举报
回复
引用 6 楼 wallesyoyo的回复:
[quote=引用 5 楼 Italink 的回复:]
[quote=引用 4 楼 wallesyoyo的回复:][quote=引用 1 楼 Italink 的回复:]
优先在可选的盒子中选强度最大的,当无法放置时,再放一堆,重复上述步骤,例题中就
最少2堆,分别是(2 2 1) (1 0)


假如有4个盒子,强度分别为1,1,0,0。按照你的算法,至少要堆三堆(1,1)(0)(0)。但实际上最少是堆两堆(1,0)(1,0)。[/quote]
0上面不能放0吗?。[/quote]

每个盒子有一个强度,代表它的上方最多能堆多少个。。。[/quote] 是我瞎了,没看清楚题目,那这个贪心解决不了,要用动态规划了哈
wallesyoyo 2019-09-20
  • 打赏
  • 举报
回复
用不着动态规划,可以将所有盒子按强度从小到大排序,然后维护一个列表,列表上的每个元素代表一个堆,元素的值是这个堆上盒子的个数。然后按强度从小到大遍历每个盒子,对每个盒子做如下处理。
1. 如果列表是空的,则新建一个堆放这个盒子。列表变为[1]
2. 列表非空,则找到列表中堆的个数刚好不大于盒子强度的那个堆(列表中的元素必须是要实时排序的)。把这个盒子放在这个堆的最底部,然后更新列表。比如,此时盒子强度是3,列表元素值为[1,1,2,2,4],则把这个盒子放到第四个堆的最底部,列表更新为[1,1,2,3,4]。
3.列表非空,但是列表中每个堆的个数都大于这个盒子的强度,则这个盒子再自成一堆,更新列表。比如,此时盒子强度为0,列表元素值为[1,2,3],更新列表后为[1,1,2,3]。
如此,放完所有的盒子后,列表的元素个数就是至少要堆多少堆的个数。

因为列表中元素需要实时排序,并且元素的值是可重复的,所以这个列表可以用std::multiset去实现。
wallesyoyo 2019-09-19
  • 打赏
  • 举报
回复
引用 1 楼 Italink 的回复:
优先在可选的盒子中选强度最大的,当无法放置时,再放一堆,重复上述步骤,例题中就
最少2堆,分别是(2 2 1) (1 0)


假如有4个盒子,强度分别为1,1,0,0。按照你的算法,至少要堆三堆(1,1)(0)(0)。但实际上最少是堆两堆(1,0)(1,0)。
笑颜″ 2019-09-19
  • 打赏
  • 举报
回复
我觉得1,2楼结合起来就是答案了
wallesyoyo 2019-09-19
  • 打赏
  • 举报
回复
引用 5 楼 Italink 的回复:
[quote=引用 4 楼 wallesyoyo的回复:][quote=引用 1 楼 Italink 的回复:]
优先在可选的盒子中选强度最大的,当无法放置时,再放一堆,重复上述步骤,例题中就
最少2堆,分别是(2 2 1) (1 0)


假如有4个盒子,强度分别为1,1,0,0。按照你的算法,至少要堆三堆(1,1)(0)(0)。但实际上最少是堆两堆(1,0)(1,0)。[/quote]
0上面不能放0吗?。[/quote]

每个盒子有一个强度,代表它的上方最多能堆多少个。。。
Italink 2019-09-19
  • 打赏
  • 举报
回复
引用 4 楼 wallesyoyo的回复:
[quote=引用 1 楼 Italink 的回复:]
优先在可选的盒子中选强度最大的,当无法放置时,再放一堆,重复上述步骤,例题中就
最少2堆,分别是(2 2 1) (1 0)


假如有4个盒子,强度分别为1,1,0,0。按照你的算法,至少要堆三堆(1,1)(0)(0)。但实际上最少是堆两堆(1,0)(1,0)。[/quote] 0上面不能放0吗?。
636f6c696e 2019-08-26
  • 打赏
  • 举报
回复
1.排序 2.选出强度最大例如N的盒子作为底层开始叠 3.第二层强度至少是N-1,挑选大于等于N-1,且最小的盒子 4.重复第三步直至顶层 5.重复2-4直至没有盒子
Italink 2019-08-25
  • 打赏
  • 举报
回复
优先在可选的盒子中选强度最大的,当无法放置时,再放一堆,重复上述步骤,例题中就 最少2堆,分别是(2 2 1) (1 0)

64,646

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧