二分及三分板子

查找大于等于x的第一个数

ll l = 0, r = n, mid;
while (l < r)
{
    
    
    mid = (l + r) >> 1;
    if (nodes[mid].val >= x)
    {
    
    
        r = mid;
    }
    else
    {
    
    
        l = mid + 1;
    }
}
printf("%lld\n",l);

浮点数情况

double eps=1e-6;

double l,r,mid;
while(r-l>eps)
{
    
    
    double mid=(l+r)/2;
}

查找小于等于x的最后一个数

ll l = 1, r = n , mid;
while (l < r)
{
    
    
    mid = (l + r + 1) >> 1;
    if (nodes[mid].val <= x)
    {
    
    
        l = mid;
    }
    else
    {
    
    
        r = mid - 1;
    }
}
printf("%lld\n",l);

查找mval等于res,且val小于等于q的最后一个数

ll l = 0, r = n - 1, mid;
while (l < r)
{
    
    
    mid = (l + r + 1) >> 1;
    if (nodes[mid].mval < res)
    {
    
    
        l = mid;
    }
    else if (nodes[mid].mval > res)
    {
    
    
        r = mid - 1;
    }
    else if (nodes[mid].val <= q)
    {
    
    
        l = mid;
    }
    else
    {
    
    
        r = mid - 1;
    }
}
printf("%lld\n",l);

二分其他小技巧
1.可二分一定次数后停止
2.最后的结果可遍历一个小的范围取最值

三分
寻找单峰函数的极值

double eps=1e-6;

double l,r,mid;
while(r-l>eps)
{
    
    
    double m1=l+(r-l)/3.0,m2=r-(r-l)/3.0;
    if(f(m1)>f(m2))
    {
    
    
        l=m1;
    }
    else
    {
    
    
        r=m2;
    }
}

猜你喜欢

转载自blog.csdn.net/m0_51270992/article/details/120810565
今日推荐