ABC184F题解

题面

题意:有 \(n\) 个物品,你可以选择若干个物品,使他们的价值之和 \(\leq t\) ,求他们价值之和的最大值。 \(n \leq 40, t\leq 10^9\)
首先看到这个 \(n\) 非常小,但是暴力的 \(O(2^n)\) 跑不过去。
这是我们就要想双端搜索。双端搜索的主要方法是:先搜一半,把这一半搜到的所有答案记录下来,再搜另一半,对于搜出的每个答案,在前一半的所有答案中找到最优的和他匹配。
那么我们先 \(O(2^n)\) 去搜索前一半,把搜到的所有答案拍到一个数组里,然后再搜后半段,同样的拍到一个数组里。然后对于后半段的每一个数,我用 \(\operatorname{lower\_ bound}\) 来算出前半段里最优的那个匹配。答案就是每一组匹配中两个数之和的最大值。

代码

posted @ 2021-10-10 08:33  1358id  阅读(56)  评论(1编辑  收藏  举报