1. 程式人生 > >洛谷P3382 【模板】三分法

洛谷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); }