二分——acwing算法基础课笔记

个人笔记,欢迎补充、指正。

此次完全以个人理解来写。

整数二分

 整数二分有两种,分别是找左边界和找右边界。

 寻找符合要求的左边界:绿色点

复制代码
int bsearch_1(int l, int r)
{
    while (l < r)
    {
        int mid = l + r >> 1;//对应下界,最左
        if (check(mid)) r = mid;
        else l = mid + 1;
    }
    return l;
}
复制代码

寻找符合要求的右边界:红色点

复制代码
int bsearch_2(int l, int r)
{
    while (l < r)
    {
        int mid = l + r + 1 >> 1;对应上界,最右
        if (check(mid)) l = mid;
        else r = mid - 1;
    }
    return l;
}
复制代码

和例题789. 数的范围 - AcWing题库结合看很容易理解

主要要确定check条件

此题

复制代码
#include<bits/stdc++.h>

using namespace std;

void func(void);

const int N = 1e5 + 10;

int n,t,ans,stp;
int a[N];

int main(void)
{
    cin >> n >> t;
    for(int i=0;i<n;++i)    cin >> a[i];
    while(t--)
    {
        cin >> stp;
        int l = 0,r = n - 1;
        while(l < r)
        {
            int mid = l + r >> 1;
            if(a[mid] >= stp)    r = mid;
            else                l = mid + 1;
        }
        if(a[l] != stp)    cout << "-1 -1\n";
        else
        {
            cout << l << ' ';
            int l = 0,r = n - 1;
            while(l<r)
            {
                int mid = l + r + 1 >> 1;
                if(a[mid] <= stp)    l = mid;
                else                r = mid - 1;
            }
            cout << l << '\n';
        } 
    }
    return 0;
}
复制代码

复制代码
#include<bits/stdc++.h>

using namespace std;

void func(void);

const int N = 1e5 + 10;

int n,t,ans,stp;
int a[N];

int main(void)
{
    cin >> n >> t;
    for(int i=0;i<n;++i)    cin >> a[i];
    while(t--)
    {
        cin >> stp;
        int l = 0,r = n - 1;
        while(l < r)
        {
            int mid = l + r >> 1;
            if(a[mid] < stp)    l = mid + 1;
            else            r = mid;
        }
        if(stp != a[l])    cout << "-1 -1\n";
        else
        {
            cout << l << ' ';
            int l = 0,r = n - 1;
            while(l < r)
            {
            int mid = l + r + 1 >> 1;
            if(a[mid] > stp)    r = mid - 1;
            else            l = mid;
            }
            cout << l << '\n';
        }

    }
    return 0;
}
复制代码

改变了check条件,但是都可ac

 

浮点数二分

浮点数二分就简单多了

复制代码
double bsearch_3(double l, double r)
{
    const double eps = 1e-6;   // eps 表示精度,取决于题目对精度的要求
    while (r - l > eps)
    {
        double mid = (l + r) / 2;
        if (check(mid)) r = mid;
        else l = mid;
    }
    return l;
}
复制代码

 

 

 

相关题目

不止可以找数,也可以找相关性质

P1873 [COCI 2011/2012 #5] EKO / 砍树 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

posted @   zerocloud01  阅读(44)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示