二分大法好!!!
当序列有序时可以用二分查找
每次偏向不能成立的方向
保留现在可以成立的最优解
当可能较多时可以先二分答案然后验证,时间复杂度问o((验证所需时间复杂度)*log(答案的所有可能数))
1:当要求最大的数最小时
{
#define mid ((l+r)>>1)
if(不成立)
l=mid+1;
else
r=mid;
}
2:当要求最小的数最大时
{
#define mid ((l+r+1)>>1)
if(不成立)
r=mid+1;
else
l=mid;
}
//stl 二分:lower_bound(a+1,a+n+1,x);upper_bound(a+1,a+n+1,x);
默认二分的序列必须为从小到大;
若更改从大到小:lower_bound(a+1,a+n+1,x,greater<int>());upper_bound(a+1,a+n+1,x,greater<int>());
默认下:(lower_bound(a+1,a+n+1,x)-a):a序列中第一个大于等于x的数在a数组中的下标
(upper_bound(a+1,a+n+1,x)-a):a序列中第一个大于x的数在a数组中的下标
三分大发好~~~~~
先在区间内取一个mid,再在l和mid之间取一个mid1,
找最大值时舍去mid和mid1中较小的一侧的数,
找最大值是舍去mid和mid1中较大的一侧的数
二分三分在探查的最后如果不能确定结束条件时可以在区间较小时枚举答案