洛谷3382用二分怎么解决

例题

这道题看上去不能直接用二分法去做,反而要用三分法。但是 只要把这个函数取导之后找到这导数的驻点就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);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值