二分算法
【最大值最小化/最小值最大化】
条件
- 按顺序【从小到大/从成立到不成立】有序状态
- 利于查找
过程
-
选择中间元素
-
偏大:缩小右界,到左侧寻找
-
偏小:放大左界,到右侧寻找
int l=0,r=a;
while(l<=r)
{
int mid=(l+r)/2;
if(mid<t) l=mid+1;//左界右移
else r=mid-1;//右界左移
}
return l-1;
二分算法
- 列举可能情况
- 用二分进行查找
- 重点:判断条件成立的函数【无需考虑最大最小】【最大值的最小、最小值的最大】
例题 NOIP 2015 跳石头
int check(int mid)
{
int num=0,c=0;
for(int i=1;i<=n+1;i++)
{
if(a[i]-c>=mid)
{
c=a[i];//更新位置 搬走一个石头
}
else if(a[i]-c<mid)
{
num++;
}
}
if(num>m)
return 0;
else
return 1;
}