二分函数

1.正常的整数(有序数列-》递增)的二分

> #include<iostream>
> using namespace std;
> const int N=1e5+10;
> int arr[N];
> int n;
> int binarysearch1(int x)//大于等于x的最大数字>=x  first右逼近
> {
>     int l=0,r=n-1;
>     while(l<r)
>     {
>         int mid=(l+r)>>1;
>         if(arr[mid]>=x)r=mid;
>         else l=mid+1;
>     }
>     return l;
> }
> int binarysearch2(int x)//小于等于x的最小数字<=x  first左逼近
> {
>     int l=0,r=n-1;
>     while(l<r)
>     {
>         int mid=(l+r+1)>>1;
>         if(arr[mid]<=x)l=mid;
>         else r=mid-1;
>     }
>     return r;
> }
> int main()
> {
>     cout<<"输出数字个数:";
>     cin>>n;
>     puts("");
>     cout<<"输出数字:";
>     for(int i=0;i<n;i++)
>     {
>         cin>>arr[i];
>     }
>     int target;
>     cout<<"输出目标数字:";
>     cin>>target;
>     int l=binarysearch1(target);
>     int r=binarysearch2(target);
>     if(arr[l]!=target)cout<<"-1 -1"<<endl;
>     else cout<<l<<" "<<r<<endl;
>     return 0;
> }

2.浮点数二分
lg:解方程

//求一个浮点数的三次方根y<=10000
#include<iostream>
#include<iomanip>
using namespace std;
double l,r;
double find(double y)
{double l=-100,r=100;
    while(r-l>1e-8)
    {double mid=(l+r)/2;
        if(mid*mid*mid<=y)l=mid;
        else r=mid;
    }
return l;


}
int main()
{double y;;
    cin>>y;
cout<<find(y);

return 0;

}

3.库函数自带的二分函数(upper_bound / lower_bound)
// 找值为 target 的位置
指针 = upper_bound(arr, arr + n, target);
arr:数组起始位置
arr+n:数组结束位置的下一个(固定写法)
target:你要找的目标数字
lower_bound → 找 第一个 ≥ 目标值 的位置
左边界
upper_bound → 找 第一个 > 目标值 的位置
右边界
样例

#include<bits/stdc++.h>
using namespace std;
const int N=2e5+10;
int arr[N];

int main()
{    
    int n,k;
    cin>>n>>k;
    for(int i=0;i<n;i++) cin>>arr[i];
    
    sort(arr, arr+n); // 必须排序!
    
    int maxres = 0;
    for(int l=0; l<n; l++){
        int target = arr[l] + k;
        // 二分找第一个大于target的位置
        int r = upper_bound(arr, arr+n, target) - arr;
        // 区间长度 = r - l
        maxres = max(maxres, r - l);
    }
    cout << maxres;
}
posted @ 2026-04-14 16:48  douzishuo  阅读(15)  评论(0)    收藏  举报