二分法

来源:互联网 发布:进入mysql控制台命令 编辑:程序博客网 时间:2024/06/08 08:59

0
1
2
3
4
5
6
7
8
9
1
4
5
7
8
12
32
43
55
231


二分查找的先决条件:
结点按关键字有序,且顺序存储,就是找一个区间,往这个区间里面试数
(前缀和,距离,长度)
二分思想:取中比较
二分关键词:至少,最多,最小等限制词
问题:在数组a中找一个不大于m的最大数ansint 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值。。。。