面试题丨一道有区分度的笔试题目分享
10978
2021.08.07
2021.08.08
发布于 未知归属地

今天训练的时候遇到一道感觉挺适合放在笔试的题目,这里分享给大家。

给定 个物品,每个物品有红色和蓝色两种款式,对于第 个物品,红色款式的美观程度为 ,蓝色款式的美观程度为 。所有美观程度都是正整数。

现在想要选择 个不同的物品,并且其中的 个物品是红色款式, 个物品是蓝色款式。请求出最大的美观程度。

对于下面的三个限制,分别设计算法并求解:

限制 (easy):,且 的值由你自行决定。

限制 (medium):,且 的值由题目给定。

限制 (hard):,且 的值由题目给定。


建议先从限制 开始想起,不要一口吃一个胖子。。。
并且需要注意时间复杂度,可以认为 及以下的方法是可以通过的。


答案:

限制 :由于 可以自行决定,所以每个物品选择 中的较大值即可。

如果最终选择了全是一种颜色的物品(例如红色),那么找一个 最小的 改为选择蓝色,尽量减少美观程度的损失。

限制 :评论区给出了 的解法,都挺好。

的解法就是常规的动态规划,用 表示按照编号顺序选择了 个红色款式和 个蓝色款式的最大美观程度,状态转移方程即为:

的解法需要灵机一动。我们可以分解成两步,第一步选择所有 个物品的红色款式,美观程度为 ;第二步选择其中的 个物品改变成蓝色款式,每一次改变美观程度会增加

所以我们对 进行降序排序,选最大的 个即可。

当然也还有 的解法。因为我们只要找出最大的 个(而它们之间的顺序无关),所以可以使用快速选择算法在 的时间找出前 大的数。

限制 :我们先考虑选择红色款式的物品。在最好的情况下,我们可以选择到前 个红色美观程度最高的物品。

但这些物品中可能有蓝色美观程度也很高的,我们需要放弃其中的一些,再按照红色美观程度接着进行选择。

因此,我们可以得到一个重要的结论:

如果所有的物品已经按照红色款式的美观程度降序排序,即 ,并且最后一个选择的红色款式的物品的下标为 ,那么编号为 的物品是全部被选择的,要么选择红色款式,要么选择蓝色款式。

证明可以借助上面的分析使用反证法:如果存在某一物品 未被选择,而第 个物品是红色的,那么我们可以改为选择第 个物品的红色款式,美观程度不会降低。

这样一来,我们就可以枚举

  • 个物品中选择 个红色款式以及 个蓝色款式;

  • 个物品中选择剩余的 个蓝色款式。

因此,我们可以在 的范围内枚举 ,对于 ,它就是限制 ,我们可以 完成;对于 ,同样可以使用快速选择算法 完成,这样总时间复杂度为

当然还有更快的做法。枚举 的过程中,对于 ,可以看成先选择所有的蓝色款式再将其中的 个换成红色款式,这里 是定值,因此可以用堆实时维护 个最大的 。对于 不是定值,但 是定值,即我们舍弃蓝色美观程度最低的 个物品,因此可以用堆实时维护 个最小的

注意 是随着 的递增往堆里添加元素,而 的随着 的递减往堆里添加元素,因此遍历两边 分别计算即可,时间复杂度为

评论 (45)