方法1
就是三分的模板之前转载过了就不写了
不过求多项式有两种效率不一样的方法可以作为参考;
//普通的求多项式
/*double F(double x){
double f=0;
for(int i=n;i>=0;i--){
double t=1;
for(int j=1;j<=i;j++)
t*=x;
f+=a[i]*t;
}
return f;
}*/
//秦九韶算法从里到外逐层计算一次多项式的值
double F(double x){
double sum=0;
for(int i=n;i>=0;i--)
sum=sum*x+a[i];
return sum;
}
方法2
微积分求导大法
易证,若f′(x)=0且f′(x−dx)∗f′(x+dx)<0则f(x) 必为原函数的一个极大值或极小值(求驻点和零点 注:此题不含驻点)
题目中已经告诉我们原函数只有一个极大值,所以我们可以使用二分导数的方法
代码
#include<bits/stdc++.h>
int n;
double a[15];
double f(double x){
double res=0;
for(int i=n;i;--i)res=res*x+a[i];
return res;
}
int main(){
double l,r,mid;
scanf("%d%lf%lf",&n,&l,&r);
for(int i=n;i;--i){
scanf("%lf",&a[i]);
a[i]*=i;
}
while(r-l>1e-6)
if(f(mid=(r+l)/2)>0)l=mid;
else r=mid;
printf("%.5lf\n",l);
}