整数二分
二分思想到底是什么?
有单调性一定可以二分,但是能二分的题目数据不一定有单调性。
边界问题,找出满足某性质的数即可。
check(mid)
true;
false;
//区间[l,r]被划分为[l,mid],[mid+1,r]时使用
int bsearch_1(int l,int r)
{
while(l < r)
{
int mid = l + r >> 1;
if(check(mid)) r = mid;
else l = mid + 1;
}
return l;
}
//区间[l,r]被划分为[l,mid-1],[mid,r]使使用
int bsearch_2(int l,int r)
{
while(l < r)
{
int mid = l + r + 1>> 1;
//注意两种方法的中间值还有边界点取法不一样
if(check(mid)) l = mid;
else r = mid - 1;
}
return l;
}
浮点数二分
举例子:开平方
经验之谈:
- 数据范围比题目给的更小,1e-4==>1e-6;
- 可以直接暴力循环上百次或者上千次而不是用数据范围来约束
- for(int i = 0; i < 100; i ++ )
#include<bits/stdc++.h>
using namespace std;
int main()
{
double x;
cin >> x;
double l = 0, r = x;
while(r - l > 1e-8)
{
double mid = (l+r)/2;
if(mid*mid < x) l = mid;
else r = mid;
}
printf("%lf\n",l);
return 0;
}