万能的二分
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. 在排序数组中查找元素的第一个和最后一个位置