hdu5105 Math Problem

题目传送门:点击这里

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

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;}



会让你的心态更平和更坦然,

hdu5105 Math Problem

相关文章:

你感兴趣的文章:

标签云: