码迷,mamicode.com
首页 > 其他好文 > 详细

hdu5105 Math Problem

时间:2015-04-09 13:50:21      阅读:144      评论:0      收藏:0      [点我收藏+]

标签:

题目传送门:点击这里       

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

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

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

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

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

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

             函数的导数为 f‘(x) = 3ax2 + 2bx + c, Δ = (2b)2 - 4*3a*c = 4(b2-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;
}




hdu5105 Math Problem

标签:

原文地址:http://blog.csdn.net/luomingjun12315/article/details/44958113

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!