洛谷1024 一元三次方程求解

算法竞赛 算法-二分/三分
编辑文章

最开始我zz的想法是直接把整个区间二分,但后来才发现只能找到一个。

然后看了下题解,因为每个长度为1的区间只可能有一个解,所以直接枚举每一个长度为1的区间来二分即可。只需要注意区间不能重复,所以可以把右端点减一个很小的数即可。

我犯的最智障的错误莫过于用快读来读了double。。。而且改了半天今早才想起,感觉白学OI了。

#define eps 1e-2

double a,b,c,d,ans[5];
int cnt;

inline bool check(double x)
{
    double sum=a*x*x*x+b*x*x+c*x+d;
    if (fabs(sum)<=eps) return 1;
    return 0;
}

inline bool check2(double x,double y)
{
    double sum1=a*x*x*x+b*x*x+c*x+d,sum2=a*y*y*y+b*y*y+c*y+d;
    if (sum1*sum2<0) return 1;
    return 0;
}

int main()
{
    scanf("%lf%lf%lf%lf",&a,&b,&c,&d);
    for (int i=-100;i<100;i++)
    {
        double l=i,r=i+1-eps;
        while (r-l>=1e-8)
        {
            double mid=(l+r)/2;
            int chk=check(mid);
            if (chk)
            {
                ans[++cnt]=mid;
                break;
            }
            if (check2(mid,r)) l=mid;
            else r=mid;
        }
    }
    for (int i=1;i<=cnt;i++) printf("%.2f ",ans[i]);
    return 0;
}

新评论

称呼不能为空
邮箱格式不合法
网站格式不合法
内容不能为空