看了看提交记录和题解,似乎有不少人是用纯暴力或是二分过的?
先上本蒟蒻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;
}
(未完)
转载于:https://blog.51cto.com/lkc314/1969907