P3382 [模板]三分法
这里提供另一种做法——二分
我们可以二分导数,当导数为零的时候就是答案了
对于求导,我们考虑导数的定义(我没学过求导),可以定义一个
e
p
s
=
1
1
0
10
eps=\frac{1}{10^{10}}
eps=10101,那么
(
f
(
x
+
e
p
s
)
−
f
(
x
)
)
/
e
p
s
(f(x+eps)-f(x))/eps
(f(x+eps)−f(x))/eps就可以看做函数在该点的导数了
code:
#include <algorithm>
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <string>
#include <queue>
#include <stack>
#include <cmath>
#include <iomanip>
#include <ctime>
using namespace std;
const double eps = 1e-10;
double l,r;
int n;
double a[25];
double f(double x) {
double u[25];
u[n]=a[n];
for(int i=n-1;i>=0;i--)
u[i]=u[i+1]*x+a[i];
return u[0];
}
double check(double x) {
double dx=eps;
double dy=f(x+dx)-f(x);
return dy/dx;
}
int main() {
cin>>n>>l>>r;
for(int i=0;i<n;i++) {
cin>>a[n-i];
}
double mid;
while(r-l>eps) {
mid=(l+r)/2.0;
if(check(mid)>0) l=mid;
else r=mid;
}
cout<<fixed<<setprecision(5)<<mid;
return 0;
}