Codeforces Round #401 (Div. 2) E. Hanoi Factory(单调栈+思维)
发布日期:2021-05-08 15:18:24 浏览次数:26 分类:精选文章

本文共 671 字,大约阅读时间需要 2 分钟。

今天遇到了一个有趣的问题,需要找出n个物品叠起来的最大高度。每个物品都有三个属性ai、bi、hi(高度),当i和j满足aj < bi ≤ bj时,i物品可以放到j物品上面。求叠起来的最大高度。

这个问题看起来有点复杂,但实际上是一个傻逼题。我们可以通过贪心算法和栈的数据结构来解决它。一开始我想复杂了,后来发现其实并不难。

首先,我们将物品按照bi从大到小排序。当处理一个物品i时,如果它的bi比栈顶物品j的aj小,那么它就不能放在j物品上面。这时候,我们需要将栈顶的物品弹出栈,直到找到一个满足aj < bi的物品j。弹出物品j时,我们需要计算弹出的j物品的hi,并将其从当前总和中减去,同时更新最大高度。

当处理完弹出物品后,如果栈顶的物品aj < bi,那么我们可以将物品i放到栈顶的物品j上面。此时,我们需要将物品i的hi加到当前总和中,并更新最大高度。

通过这种方法,我们可以保证每次叠加的物品都是最优的,从而得到叠起来的最大高度。

以下是具体实现步骤:

  • 读取n个物品的数据。
  • 将物品按照bi从大到小排序。
  • 初始化一个栈来维护物品的堆叠顺序。
  • 遍历每个物品,处理栈中的物品,弹出不符合条件的物品,并更新当前总和和最大高度。
  • 将当前物品压入栈,更新当前总和和最大高度。
  • 最后输出最大高度。
  • 在实现过程中,我们需要注意以下几点:

    • 使用长长型变量来存储高度,避免溢出。
    • 在弹出物品时,需要及时更新当前总和,并记录最大高度。
    • 栈的操作需要高效处理,确保时间复杂度为O(n)。

    通过上述步骤,我们可以高效地解决这个问题,得到叠起来的最大高度。

    上一篇:Codeforces Round #344 (Div. 2) C. Report(思维好题)
    下一篇:Codeforces Round #305 (Div. 1) B. Mike and Feet(单调栈)

    发表评论

    最新留言

    路过按个爪印,很不错,赞一个!
    [***.219.124.196]2025年03月22日 06时46分19秒