二分函数
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;
}

浙公网安备 33010602011771号