二分、三分、01分数规划1——二分查找
1、二分查找代码
找>=x的第一个位置
while(l<r)
{
mid=(l+r)/2;
if(a[mid]>=x) r=mid-1;
else l=mid+1;
}
//结果为 r+1,即 l
找<=x的第一个位置
while(l<r)
{
mid=(l+r)/2;
if(a[mid]<=x) l=mid+1;
else r=mid-1;
}
//结果为 l-1 ,即 r
2、C++ STL的二分查找函数
binary_search 返回bool值,是否存在
lower_bound 返回可插入的最小值位置的迭代器
即返回第一个符号条件的元素位置
upper_bound返回可插入的最大位置的迭代器
即返回最后一个符合条件的元素位置
例,lower_bound(a,a+11,55);
3、二分答案+检验
二分枚举+检验
:求解类问题转化为验证类问题
例题1:牛棚
N个牛棚在x轴上,已知它们的坐标xi,有C只奶牛,要放进牛棚,每个牛棚只能放一只奶牛,要求奶牛间距离最近的距离最大,求这个距离。
思路(枚举距离x + 检验对应结果)
假设奶牛间距离为x,依次将奶牛放在距离>=x的牛棚中,统计一共放下的奶牛数量cnt。如果cnt大于奶牛数量C,试着将距离x增大,重新检验;如果cnt小于奶牛数量C,将距离x减小,重新检验。
最后输出合适距离x
例题2:Drying
n件衣服要晾干,每件含水量ai,每件衣服每分钟自然风干1单位的水,每分钟可对其中的任意一件使用吹风机,其可以减少k的水。求晾干所有衣服的最少时间。
思路(枚举晾干衣服时间t + 检验对应结果)
假设晾干时间为t,将衣服按时间t分为两大类,t时间内可以自然风干的、需要借助吹风机吹干的。计算用吹风机花在每件衣服上的总和sum,比较sum与t,如果sum小于t,可试着适当减小t的值,重新检验;如果sum大于t,增大t的值,重新检验。
最后输出合适的t