整数二分
- 对于整数二分而言,也就是所对应的数据是一串有序的整数。其实二分的作用就是去查找某个性质的左右边界,比方说查找大于等于x的右边界,小于等于y的左边界等。
- 然后在这边有一个通用的模板,可供参考
int l=xxx;
int r=xxx;
while(l<r)
{
int mid=(l+r)/2;
//或者
int mid=(l+r+1)/2;
if (xxxx)
{
//......
}
else
{
//......
}
//在上面这个if else 当中,就两种情况,背牢
1. l=mid r=mid-1;
那么 mid=(l+r+1)/2;
2. r=mid l=mid+1
那么 mid=(l+r)/2
}
//while退出来的时候l==r
经典例题
#include <stdio.h>
#define N 100010
//存放数据的数组
int arr[N];
//数的个数
int n;
//询问次数
int m;
int main()
{
//输入
scanf("%d %d",&n,&m);
for (int i=0;i<n;i++)
{
scanf("%d",&arr[i]);
}
//询问
int num=0;
while(m--)
{
scanf("%d",&num);
//开始二分
int l=0;
int r=n-1;
while(l<r)
{
int mid=(l+r+1)/2;
if (arr[mid]<=num)
{
l=mid;
}
else
{
r=mid-1;
}
}
if (arr[l]!=num)
{
printf("%d %d\n",-1,-1);
}
else
{
//开始二分
int left=0;
int right=l;
while(left<right)
{
int mid=(left+right)/2;
if (arr[mid]<num)
{
left=mid+1;
}
else
{
right=mid;
}
}
printf("%d %d\n",left,l);
}
}
return 0;
}
浮点数二分
- 浮点数的二分的话相对比较容易一点,因为它不需要像整数二分的一样去判断一下范围,也就意味着他不需要去处理边界问题
- 首先一个很大的区别就在于这个while判断条件,这个判断条件里面就是需要根据题目的精度条件进行确定。
- 然后在while循环里面的if else语句下直接无脑l=mid, r=mid,不需要考虑边界问题。
经典例题
#include <stdio.h>
double num;
int main()
{
//输入
scanf("%lf",&num);
//开始二分
double mid=0;
double left=-10000;
double right=10000;
while(right-left>=1e-8)
{
mid=(left+right)/2;
if (mid*mid*mid<num)
{
left=mid;
}
else
{
right=mid;
}
}
printf("%lf\n",left);
return 0;
}
最后附上一份yxc模板: