洛谷P3382 【模板】三分法

题目链接

方法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);
}
发布了59 篇原创文章 · 获赞 8 · 访问量 7629
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章