今天主要复习了二分答案.
1.运用二分答案需要满足以下条件
1、答案在一个区间内(一般情况下,区间会很大,暴力超时)
2.最常见的二分答案题目是【最大值的最小】或【最小值的最大】。遇到这样的题目着重优先考虑二分答案 。题目为【最大值的最小时】往左搜索,另一个则往右搜索。
向左搜索的模板如下
while(l<r)
{
int mid=l+r>>1;
if(check(mid)) r=mid;
else l=mid+1;
}
向右搜索的模板如下
while(l<r)
{
int mid=l+r+1>>1;
if(check(i)) l=mid;
else r=mid-1;
}
3.接下来看例题
这道题着重点在于条件check的判断。先按照mid进行划分,在比较结果与输入的不同来向左右取舍,可以比较二分模板向左或向右进行书写。这道题要设now(当前位置)和i(目标位置)。
二.
与上题不同,这题比较的是取走棋子最大值的的最小值。