今天训练的时候遇到一道感觉挺适合放在笔试的题目,这里分享给大家。
给定 个物品,每个物品有红色和蓝色两种款式,对于第 个物品,红色款式的美观程度为 ,蓝色款式的美观程度为 。所有美观程度都是正整数。
现在想要选择 个不同的物品,并且其中的 个物品是红色款式, 个物品是蓝色款式。请求出最大的美观程度。
对于下面的三个限制,分别设计算法并求解:
限制 (easy):,且 和 的值由你自行决定。
限制 (medium):,且 和 的值由题目给定。
限制 (hard):,且 和 的值由题目给定。
建议先从限制 开始想起,不要一口吃一个胖子。。。
并且需要注意时间复杂度,可以认为 及以下的方法是可以通过的。
答案:
限制 :由于 和 可以自行决定,所以每个物品选择 和 中的较大值即可。
如果最终选择了全是一种颜色的物品(例如红色),那么找一个 最小的 改为选择蓝色,尽量减少美观程度的损失。
限制 :评论区给出了 和 的解法,都挺好。
的解法就是常规的动态规划,用 表示按照编号顺序选择了 个红色款式和 个蓝色款式的最大美观程度,状态转移方程即为:
的解法需要灵机一动。我们可以分解成两步,第一步选择所有 个物品的红色款式,美观程度为 ;第二步选择其中的 个物品改变成蓝色款式,每一次改变美观程度会增加 。
所以我们对 进行降序排序,选最大的 个即可。
当然也还有 的解法。因为我们只要找出最大的 个(而它们之间的顺序无关),所以可以使用快速选择算法在 的时间找出前 大的数。
限制 :我们先考虑选择红色款式的物品。在最好的情况下,我们可以选择到前 个红色美观程度最高的物品。
但这些物品中可能有蓝色美观程度也很高的,我们需要放弃其中的一些,再按照红色美观程度接着进行选择。
因此,我们可以得到一个重要的结论:
如果所有的物品已经按照红色款式的美观程度降序排序,即 ,并且最后一个选择的红色款式的物品的下标为 ,那么编号为 的物品是全部被选择的,要么选择红色款式,要么选择蓝色款式。
证明可以借助上面的分析使用反证法:如果存在某一物品 未被选择,而第 个物品是红色的,那么我们可以改为选择第 个物品的红色款式,美观程度不会降低。
这样一来,我们就可以枚举 :
第 个物品中选择 个红色款式以及 个蓝色款式;
第 个物品中选择剩余的 个蓝色款式。
因此,我们可以在 的范围内枚举 ,对于 ,它就是限制 ,我们可以 完成;对于 ,同样可以使用快速选择算法 完成,这样总时间复杂度为 。
当然还有更快的做法。枚举 的过程中,对于 ,可以看成先选择所有的蓝色款式再将其中的 个换成红色款式,这里 是定值,因此可以用堆实时维护 个最大的 。对于 , 不是定值,但 是定值,即我们舍弃蓝色美观程度最低的 个物品,因此可以用堆实时维护 个最小的 。
注意 是随着 的递增往堆里添加元素,而 的随着 的递减往堆里添加元素,因此遍历两边 分别计算即可,时间复杂度为 。