看了看提交记录和题解,似乎有不少人是用纯暴力或是二分过的?

先上本蒟蒻0msAC详情:洛谷评测详情

(有一篇题解的做法和我一样)


-------------------------------分割线-------------------------------


当我看到这道题的时候,我先想到的是套公式(用公式不就是在欺负这道题吗)二分过,结果写不出代码……十分尴尬。

等等……这不就是求函数零点吗?

于是,我想到了牛顿迭代法。(拉弗森听了想打人系列)

设y=ax^3+bx^2+cx+d,则y的导函数y'=3ax^2+2bx+c。

以-101和101分别为起点求出方程两根,再以其中点为起点即可找到第三根。

(不知为何这里没有出现求到同一根上的情况)

简单粗暴,效率也很好。

附代码:

#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
double a,b,c,d,x1,x2,x3;
double F(double x){return a*x*x*x+b*x*x+c*x+d;}
double dF(double x){return 3.0*a*x*x+2.0*b*x+c;}
double nrm(double x){return x-F(x)/dF(x);}
void swap2(double &x1,double &x2){double t=x1;x1=x2;x2=t;}
int main(){
    cin>>a>>b>>c>>d;
    for(x1=-101.0;fabs(F(x1))>0.001;x1=nrm(x1));
    for(x2=101.0;fabs(F(x2))>0.001;x2=nrm(x2));
    for(x3=(x1+x2)/2.0;fabs(F(x3))>0.001;x3=nrm(x3));
    if(x1<0 && x1>(-0.01))x1=-x1;
    if(x2<0 && x2>(-0.01))x2=-x2;
    if(x3<0 && x3>(-0.01))x3=-x3;
    printf("%.2f %.2f %.2f\n",x1,x3,x2);
    return 0;
}

(未完)