hdu5105 Math Problem

本文详细解析高中数学题中关于函数极值与区间最值的求解方法,针对不同类型的函数提供了具体的求解步骤,包括线性函数、二次函数和三次函数等,并通过代码实现了解题过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目传送门:点击这里       

这道题其实说白了就是一道高中的数学题。对于绝对值得最大值无非就是,两端点或者两顶点。因此我们只需分别讨论一下即可。

        1、a = 0时,此时函数为 f(x) = bx² + cx+d

        ①b = 0 时,此时方程变成 f(x) = cx + d,此时函数为线性变化,故最值出现两端点处。

        ②b ≠ 0 时,此时方程为 f(x) = bx² + cx + d,此时函数变为二次函数。

            此时函数的最值在对称轴 z = -c/2b 或两端点。

        2、a ≠ 0 时,函数为 f(x) = ax³ + bx² + cx + d,这种情况稍稍麻烦一些,这时需要借助导数来判断。

             函数的导数为 f'(x) = 3ax² + 2bx + c, Δ = (2b)² - 4*3a*c = 4(b²-3ac).

        ①当 Δ ≤ 0 时,f(x)为单调函数,故最值出现在两端点

        ②当 Δ > 0 时,令 f'(x) = 0   =>  x1 = (-sqrt(Δ) - 2b)/(2*3a),x2 = (sqrt(Δ) - 2b)/(2*3a)

        (ⅰ)当 x1,x2都在区间 [L,R] 内,则最值在 f(L),f(R),f(x1),f(x2)之中

        (ⅱ)当x1或x2只有一个在 [L,R]内时,则最值在 f(L),f(R),f(x1)或f(x2)之中

        (ⅲ)当x1,x2均不在区间[L,R]内,则最值在 f(L),f(R)之中

代码如下:

#include <math.h>
#include <stdio.h>

double a,b,c,d,L,R;
double disc,x1,x2,z;
double max(double a,double b){
    return a>b?a:b;
}

double f(double x){
    if( x>=L && x<=R )
        return fabs(a*x*x*x + b*x*x + c*x + d);
    return -1;
}

int main(){
    while(scanf("%lf%lf%lf%lf%lf%lf",&a,&b,&c,&d,&L,&R)==6){
        if(a!=0){
            disc = b*b-3*a*c;
            if(disc<=0){
                printf("%.2f\n",max(f(L),f(R)));
            }else{
                x1=(-sqrt(disc)-b)/(3*a);
                x2=(sqrt(disc)-b)/(3*a);
                printf("%.2f\n",max(max(f(L),f(R)),max(f(x1),f(x2))));
            }
        }else{
            if(b==0)
                printf("%.2f\n",max(f(L),f(R)));
            else{
                z = (-c)/(2*b);
                printf("%.2f\n",max(f(L),max(f(R),f(z))));
            }
        }
    }
    return 0;
}

由于hdu的数据不够完美,所以还可以这样(当然这样有bug)

#include <math.h>
#include <stdio.h>

double a,b,c,d,L,R;
double max(double a,double b){
    return a>b?a:b;
}
double f(double x){
    if( x>=L && x<=R )
        return fabs(a*x*x*x + b*x*x + c*x + d);
    return -1;
}
int main(){
    double disc,x1,x2,z;
    while(scanf("%lf%lf%lf%lf%lf%lf",&a,&b,&c,&d,&L,&R)==6){
        disc = b*b-3*a*c,z = (-c)/(2*b);
        x1 = (-sqrt(disc)-b)/(3*a),x2 = (sqrt(disc)-b)/(3*a);
        printf("%.2f\n",max(max(f(L),max(f(R),f(z))),max(f(x1),f(x2))));
    }
    return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值