二分答案的实际应用与变式

一.二分查找之于STL

lower_bound()可以寻找第一个大于等于的

upper_bound()可以寻找第一个大于的

返回直应用auto承载,或在获取指针时-数组名/-vec.begin()

distance(st.begin(),st.end())也可以获得其中元素个数

和以上两个函数相作用,其用法不言而喻

二.二分法求函数值

使用前提:函数在该区间内有单调性

int bs(int l,int r)
{
    int mid;
    while(l<=r)
    {
        mid=l+(r-l)/2;
        if(check(mid))
        {
            l=mid+1;
            ans=mid;
        }
        else
        {
            r=mid-1;
        }
    }
}//当取值为int类型时的用法

double bs(double l,double r)
{
    double mid;
    while(l<r)
    {
        mid=(l+r)/2;
        if(check(mid))
        {
            l=mid;
        }
        else
        {
            r=mid;
        }
    }
    return mid;
}//当取值为double类型时的用法

例:1.P1024:一元二次方程组求解

https://www.luogu.com.cn/problem/P1024

二分查找直接套用上面的模板

题目要求给到小数点后两位,故r与l的误差范围至少要<0.01

check函数里面应该是题目已经给出的 f(x1)×f(x2)<0

double f(double x)
{
	return (a*x*x*x+b*x*x+c*x+d);
}
bool check(double l,double r)
{
	return f(l)*f(r)<=0;
}
void bs(double l,double r)
{
	double mid;
	while(r-l>=0.001)
	{
		mid=(l+r)/2;
		if(check(l,mid))
		{
			r=mid;
		}
		else
		{
			ans=mid;
			l=mid;
		}
	}
	printf("%.2f ",l);
}

 

posted @ 2023-04-08 19:35  美索maysoul  阅读(54)  评论(1)    收藏  举报