洛谷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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章