0
|
1
|
2
|
3
|
4
|
5
|
6
|
7
|
8
|
9
|
1
|
4
|
5
|
7
|
8
|
12
|
32
|
43
|
55
|
231
|
二分查找的先决条件:
结点按关键字有序,且顺序存储,就是找一个区间,往这个区间里面试数
(前缀和,距离,长度)
二分思想:取中比较
二分关键词:至少,最多,最小等限制词
问题:在数组a中找一个不大于m的最大数ans
int a[M]; 定义数组大小
Int n, m; 定义数组大小与要查询的数
int left, right, mid; 定义边界与中点
left = 0, right = n-1; //定义边界时要注意度
while(left <= right) //退出循环的条件
{
mid = (left + right) / 2; //或者(left + right) << 1
if(solve(mid) /*判断方案*/ )
{
ans = a[mid]; //答案存放点
left = mid + 1; //满足之后往右走一步,因为左边的都已经满足条件,且已经存入答案,放弃
}
else
{
right = mid - 1; //不满足的时候往左走一步,因为右边的都不满足条件,放弃
}
}
另外 两个函数 upper_bound() lower_bound() 点击打开链接
下面是偷得大佬的
首先如果是整数。。。则有如下技巧。。。首先由4个变量。。le,ri,mid,ans。。。
首先控制结束。。。为(le<=ri)!!!
然后更新的时候结果到底输出什么??
用ans保存可行的mid,不断更新。。最后要求的值就在ans里面。。。(ps:因为ans已经代表了当前le和ri的最好的情况。。)
然后就是左右边界的确定。。。
整数为:
选右区间:l=mid+1;
选做区间:r=mid-1;
ans=mid,保存解。。。
整数处理是最坑的,浮点数无非是精度问题。。。。
浮点数的边界控制为(ri-le>eps)
选右区间:l=mid;
做左区间:ri=mid;
最后结果输出mid值。。。。