洛谷3382用二分怎么解决

来源:互联网 发布:淘宝发布水果宝贝类目 编辑:程序博客网 时间:2024/04/27 15:20
例题

这道题看上去不能直接用二分法去做,反而要用三分法。但是 只要把这个函数取导之后找到这导数的驻点就ok了。
但是什么是导数呢?因为导数实在是太多了,这里就不一一列举了。这里只说明一下幂函数的导数,幂函数的导数为:f(x)=x^n
那么 f(x)的导数为nx^(n-1)
所以这道题就很好理解了,现在来看代码:

#include<cstdio>#include<cstdlib>#include<iostream>#include<cmath>using namespace std;double a[50];int n;double ds(double l) {//求导数的值    double  p=0;    for(int i=n; i>=1; i--) {        int y=i;        double o=a[i];        y-=1;        while(y>0) {            o*=l;            y--;        }        p+=o;    }    return p;}void efda(double l,double r) {    if(r-l<=1e-6) {        printf("%0.5lf",l);        exit(0);//结束    }    double mid=(l+r)/2,lp=ds(mid);    if(lp<0)            efda(l,mid);//这里用二次函数在草稿纸上枚举一次就可以知道怎么二分答案了    else if(lp>0)        efda(mid,r);    else {//如果导数为零,直接输出        cout<<mid;        exit(0);//结束    }}int main() {    double l,r,pp;    cin>>n>>l>>r;    for(int i=n; i>=1; i--) {        cin>>a[i];        a[i]*=i;//为了方便求导数    }    cin>>pp;    efda(l,r);}
原创粉丝点击