luogu 1024 一元三次方程求解
StarlightChen · · 题解
课堂例题1: luogu1024 答案在[-100,100]范围内,两个根的差的绝对值>=1,故每一个大小为1的区间里至多有1个解。
这是一个0011模型的题,我们利用二分法不断接近零点,所求得的极小区间就是出现的第一个1即l就是我们想要的答案。
代码如下:
#include<bits/stdc++.h>
using namespace std;
#define maxn 500010
const double eps=1e-4; //相当于定义一个精度常量0.0001
double a,b,c,d,l,r,mid;
double f(double x){ //原方程
return x*x*x*a+x*x*b+x*c+d;
}
int main(){
cin>>a>>b>>c>>d;
for(int i=-100;i<=100;++i){ //枚举根所在的区间
l=i; //左区间l-mid
r=l+1; //右区间mid-r
if(f(l)==0){ //找到零点
printf("%.2f ",l);
continue;
}
if(f(l)*f(r)<0){//满足二分条件
while(r-l>eps){//卡精度用的
mid=(l+r)/2;
if(f(mid)*f(r)<=0) l=mid; //如果mid-r满足二分条件,说明答案在此区间,将左区间更新至mid继续查询
else r=mid; //如果l-mid满足条件,就将右区间更新至mid
}
printf("%.2f ",l); //在这个0011模型中第一个出现的1即为所求
}
}
return 0;
}