基础算法——二分

文章目录

  • 整数二分的作用、应用条件
  • 整数二分板子的来龙去脉
  • 整数二分板子
  • 浮点数二分的作用、应用条件
  • 浮点数二分板子

一、整数二分的作用、应用条件

查找在数组中的目标值的下标

应用条件为有序

二、整数二分板子的来龙去脉

代码演示过程如下:

 

 

 

三、整数二分代码

int find(int q){
    int l=0,r=n+1; //开区间
    while(l+1<r){ //l+1<r时结束
        int mid=l+r>>1;
        if(a[mid]<=q) l=mid;
        else r=mid;
    }
    return l;
}

int find(int q){
    int l=0,r=n+1; //开区间
    while(l+1<r){ //l+1=r时结束
        int mid=l+r>>1;
        if(a[mid]>=q) r=mid;
        else l=mid;
    }
    return r;
}

四、 浮点数二分的作用、应用条件

计算方程/某个值y...的根/几次方根...

应用条件为[l,r]是有序、连续、单调

五、浮点数二分板子

double find(double y){
    double l=-100, r=100;
    while(r-l>1e-5){
        double mid=(l+r)/2;
        if(mid*mid*mid<=y) l=mid;
        else r=mid;
    }
    return l;
}

int main(){
    double y; scanf("%lf",&y);
    printf("%.31f\n",find(y));
    return 0;
}

double fun(double x){
    return a*x*x*x+b*x*x+c*x+d;
}

double find(double l,double r){
    while(r-l>0.0001){
        double mid=(l+r)/2;
        if(fun(mid)*fun(r)<0) l=mid; //最大化
        else r=mid;
    }
    return l;
}

int main(){
    scanf("%lf%lf%lf%lf",&a,&b,&c,&d);
    for(int i=-100;i<100;i++){
        double y1=fun(i), y2=fun(i+1);
        if(!y1) printf("%.2lf ", 1.0*i);
        if(y1*y2<0)printf("%.2lf ",find(i,i+1));
    }
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值