洛谷P3382 【模板】三分法
阿新 • • 發佈:2019-02-05
方法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);
}