标签:
题目传送门:点击这里
这道题其实说白了就是一道高中的数学题。对于绝对值得最大值无非就是,两端点或者两顶点。因此我们只需分别讨论一下即可。
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; }
标签:
原文地址:http://blog.csdn.net/luomingjun12315/article/details/44958113