麻烦帮我看看二分的问题(代码量很少)

P1462 通往奥格瑞玛的道路

bszmh @ 2018-08-10 17:36:52

while(left+1<right)
{
    mid=(left+right)/2;
    if(check(u[mid])) 
        right=mid; 
    else
        left=mid;
}
cout<<right;

上面这段wa了 但下面这段ac,想不通为什么

while(left<=right)
{
    mid=(left+right)/2;
    if(cheak(u[mid])==true)
    {
        ans=u[mid];
        right=mid-1;
    }
    else
    left=mid+1;
}
cout<<ans;

谢谢


by 梦游 @ 2018-08-10 17:49:46

while(left+1<right) //left+1<=right

    right=mid;

//right=mid-1;

    left=mid;

//left=mid+1;


by bszmh @ 2018-08-10 18:39:18

@贞白吴啸 不好意思,补充一下 ac的那个int left=1,right=n;(左闭右闭) wa的int left=0,right=n;(左开右闭)


by 梦游 @ 2018-08-10 19:23:46

好吧~ 我似乎误人子弟了~ 所以决定给你一份二分模板: bool binarysearch(long long* arr, long long start, long long end, long long aim){ while(start <= end){ long long k = (start+end)/2; long long t = arr[k]; if (t == aim) return true; else if (t > aim) end = k-1; else start = k+1; } return false; }


by bszmh @ 2018-08-10 19:51:28

@贞白吴啸 orz,3Q


by 梦游 @ 2018-08-10 19:56:27

@bszmh orz?厉害了, 我又学到了一个新词~


by ThebestJoe @ 2021-11-23 23:28:55

你好,这个两个二分我都用了(都已经ac),嗯就是你第一个wa的二分,它是二分一段连续的数,l=数组最小的数,r=数组最大的那个数。 第二个二分是二分数组的下标,它是一些离散的数(当然你要从小到大排序)速度也是要快一点的 第三,我不会告诉你这个题我提交了63次,哈哈哈


|