二分查找(Binary search),简写bsearch
需要注意的点,int mid = l + r >> 1或者int mid = l + r + 1 >> 1;请写在while循环里面,因为每一次都要更新mid坐标
如何写整数二分
第一步:构造check();同时先写mid = l + r >> 1;
第二步:根据题意确定下一次划分的范围(正确答案所在的范围)
第三步:写代码,如果check()return true的下一步是l = mid,那么原先的mid就+ 1,否则可以不用动
特别注意事项
- 整数二分不要写成浮点数二分,例如边界为n不要变成x,否则容易RE
- mid记得放进while(l < r)里边
下面是整数二分查找TPL:
bool check(){};
int bsearch_1(int l,int r)
{
while(l < r)
{
int mid = l + r >> 1;//注意mid要放在第二层while里边!!
if(check(mid)) r = mid;
else l = mid + 1;
}
}
int bsearch_2(int l,int r)
{
while(l < r)
{
int mid = l + r + 1 >> 1;//注意mid要放在第二层while里边!!
if(check(mid)) l = mid;//如果l = mid的话mid = l + r + 1 >> 1,防止死循环导致的TLE
else r = mid - 1;
}
return 1;
}
浮点数二分
如果保留两位小数,就取1e-4;保留6位小数就取1e-8,一般保留n位小数,取1e-(n+2);
#include<bits/stdc++.h>
using namespace std;
int main()
{
double n;
double mid;
cin >> n;
double l = 0,r = n;
while(r - l>1e-6)
{
mid = (l + r) / 2;
if(mid*mid >= n) r = mid;
else l = mid;
}
cout << mid;
}
浮点数二分还可以这样写
#include<bits/stdc++.h>
using namespace std;
int main()
{
double n;
double mid;
cin >> n;
double l = 0,r = n;
for(int i=0;i<100;i++)//直接循环100次,也就是被划分100次
{
mid = (l + r) / 2;
if(mid*mid >= n) r = mid;
else l = mid;
}
cout << mid;
}