整数二分
int bs(int a[],int l,int r){//binary_search
while(l<r){
int mid=l+r>>1;
if(check(mid))l=mid;
else r=mid-1;
}
return l;
}
int bs(int a[],int l,int r){//binary_search
while(l<r){
int mid=l+r>>1;
if(check(mid))l=mid+1;
else r=mid;
}
return l;
}
实数二分
double bs(double l,double r){
while(r-l>1e-8){
double mid=(l+r)/2;
if(check(mid))l=mid;
else r=mid;
}
return l;
}
例题
P1024 [NOIP2001 提高组] 一元三次方程求解
#include<bits/stdc++.h>
using namespace std;
double a,b,c,d,ans=-101;
inline double f(double x){
return a*pow(x,3)+b*pow(x,2)+c*x+d;
}
int main(){
cin>>a>>b>>c>>d;
for(double x=-100;x<=99;x+=1){//查找区间[x,x+1)
if(f(x)*f(x+1)<=0){
double l=x,r=x+1,mid=(l+r)/2;
while(abs(f(mid))>1e-6){
mid=(l+r)/2;
if(f(mid)*f(l)<=0)r=mid;
else l=mid;
}
if(abs(l-ans)>=1){
printf("%.2lf ",l);
ans=l;
}//防止重复输出
}
}
}