码迷,mamicode.com
首页 > 其他好文 > 详细

万能的二分

时间:2018-06-23 20:56:44      阅读:162      评论:0      收藏:0      [点我收藏+]

标签:sum   效果   时间复杂度   gre   均值   价值   条件   最小值   IV   

最大化最小值

先上题目:

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

つづく...

万能的二分

标签:sum   效果   时间复杂度   gre   均值   价值   条件   最小值   IV   

原文地址:https://www.cnblogs.com/hnfms-jerry/p/binary_search.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!