二分查找时数组是有序的
一.整数二分(有边界问题)
二分的本质是边界
//[l,r]被划分为[l,mid]和[mid+1,r]
//往左找答案
int l=0,r=n-1;
while(l<r)
{
int mid=l+r>>1;
if(a[mid]<x)
l=mid+1;
else
r=mid;
}
//[l,r]被划分为[l,mid-1]和[mid,r]
//往右找答案
int l=0,r=n-1;
while(l<r)
{
int mid=l+r+1>>1;
if(a[mid]<=x)
l=mid;
else
r=mid-1;
}
二.浮点数二分
#include<iostream>
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)
r=mid;
else
l=mid;
}
printf("%lf\n",l);
return 0;
}