二分

二分查找

用于有规律的数列对数的查找

二分的暴力解法

int find(int temp)
{
    int l=1,r=n;
    while (l<r)
    {
        int mid=l+(r-l)/2;
        if (a[mid]>=temp) r=mid;
        else l=mid+1;
    }

    if (a[l]==x) return l;
    else return -1;
}

那就只能用 STL 自带的二分函数—— upper_boundlower_bound

这两个函数的作用是二分查找一个数在数组中出现的位置。区别是 upper 返回第一个大于搜索数的位置,而 lower 是第一个大于等于的数的位置。

lower_bound(a.begin(),a.end(),x);
//手写
int lower_bound(int temp)
{
    int l=0,r=n+1;
    while(l+1<r)
    {
        int mid=l+(r-l)/2;
        if(a[mid]>=temp)
            r=mid;
        else
            l=mid;
    }
    return r;
}
//注意返回的是地址
int temp=lower_bound(a.begin(),a.end(),x)-a;
int lower_bound(int temp)
{
    int l=0,r=n+1;
    while(l+1<r)
    {
        int mid=l+(r-l)/2;
        if(a[mid]<=temp)
            l=mid;
        else
            r=mid;
    }
    return r;
}

可以用桶

或者更好的用STL中的map

map<int.int> ma;
for(int i=1;i<=n;i++)
{
    cin>>a[i];
    if(!ma[a[i]])//判断只记录第一个
        ma[a[i]]=i;
}

二分求解方程解

对于解的区间在【-100~100】之间的解,且两个解的差绝对值大于1,可采用二分暴力枚举

double f(double a,double b,double c)
{
    return a*x*x+b*x+c;
}

//主函数
cin>>a>>b>>c;
double l,r,x1,x2;
if(x1)
for(int i=-100;i<100;i++)
{
    x1=f(l);
	x2=f(r);
	int s=0;
	if(!x1)
	{   
    	s++;
    	cout << fixed << setprecision(2) << l<<" ";
	}
    if(x1*x2<0)
    {
        while(r-l>=0.001)
        {
            double mid=(l+r)/2;
            if(f(mid)*f(r)<=0)
                l=mid;
            else
                r=mid;
        }
       cout << fixed << setprecision(2) << l<<" ";
    }
    if(s==2)
        break;
}

posted @ 2025-07-07 15:39  星空丶star  阅读(7)  评论(0)    收藏  举报