P3382 [模板]三分法(二分)

mac2024-01-25  33

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; }
最新回复(0)