万能的二分

Posted hnfms-jerry

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了万能的二分相关的知识,希望对你有一定的参考价值。

最大化最小值

先上题目:

Aggressive cows
题目简意:
在一条直线上有N个位置,第(i)个位置的坐标是(X_i),现在有M头牛要放入这N个位置中,并最大化两头牛之间的距离.

这道题我们可以用二分搜索来做.设d(x)为能否让任意两头牛之间的距离大于等于x,那么显然我们从1~INF去二分这个数,直到找到满足条件的最大的x

那么对于每一个x,我们要去验证是否可行:
假设第i头牛放在第y位置,那么显然第i+1头要放在坐标大于等于y+x的位置;
就这样一直枚举到最后,如果全部都能放完,就说明可行.

代码略.

最大化平均值又称 分数规划

题目:

有n个物品的重量和价值分别是(w_i)(v_i).从中选出k个物品使得单位重量价值最大.

(1<=k<=n<=1e4)
(1<=w_i, v_i <= 1e6)

还是用二分搜索.
定义C(x)为可以选择使得单位重量的价值不小于x
那么假设我们选的是集合S:
那么他们的单位重量价值为:
[ sum_{i∈s}{v_i} / sum_{i∈s}{w_i} ]

结合C(x)判断就是是否满足:
[ sum_{i∈s}{v_i} / sum_{i∈s}{w_i} >= x ]

变形后可以得到:
[ sum_{i∈s}{v_i - x*w_i} >= 0 ]

然后就可以变成简单的贪心了!!!
对$ v_i - x*w_i $的值进行排序后贪心选取:

C(x) = (将((v_i - x*w_i))从大到小排列后的前k个的和不小于0)

对于此, 由于要排序,每次判断的时间复杂度为(O(N log N))这个是用于排序的

总的时间复杂度是:$ O(N log N log N) $

总结:

像这种dp不是很好做,搜索显然过不了的题,或者是如果知道答案再去套会很简单的题,二分答案是最佳选择,并不很影响时间复杂度,又起到了枚举答案的效果,当然,答案应该是有序的.

つづく...













以上是关于万能的二分的主要内容,如果未能解决你的问题,请参考以下文章

二分法万能模板Leecode 74. 搜索二维矩阵——Leecode日常刷题系列

二分法万能模板Leecode 222. 完全二叉树的节点个数——Leecode日常刷题系列

二分查找万能模板,告别死循环告别越界Leecode 34. 在排序数组中查找元素的第一个和最后一个位置

二分查找万能模板,告别死循环告别越界Leecode 34. 在排序数组中查找元素的第一个和最后一个位置

二分法万能模板,告别死循环越界Leecode 69. Sqrt(x)——Leecode日常刷题系列

二分法万能模板,告别死循环越界Leecode 69. Sqrt(x)——Leecode日常刷题系列