Problem Description
Here has an function:
f(x)=|a∗x3+b∗x2+c∗x+d|(L≤x≤R)
Please figure out the maximum result of f(x).
f(x)=|a∗x3+b∗x2+c∗x+d|(L≤x≤R)
Please figure out the maximum result of f(x).
Input
Multiple test cases(less than 100). For each test case, there will be only 1 line contains 6 numbers a, b, c, d, L and R.
(−10≤a,b,c,d≤10,−100≤L≤R≤100)
Output
For each test case, print the answer that was rounded to 2 digits after decimal point in 1 line.
Sample Input
1.00 2.00 3.00 4.00 5.00 6.00
Sample Output
310.00 求函数f(x)的最大值。 大体思路是先求f(L)和f(R)两个边界值,取较大的,然后判断a是否为0。 如果a不为0,即为一元三次方程,求f'(x)=0时的两个点,若点在[L,R]这个区间,则分别与边界值中较大的继续比较。 如果a为0,即为一元二次方程,求出最值与边界值中较大的比较。 这题有人枚举0.01精度居然过了,还叉不掉,也是醉了- -#include<iostream> #include<stdio.h> #include<cstring> #include<cstdlib> #include<cmath> using namespace std; int max(const int a,const int b) { return a>b?a:b; } int main() { double a,b,c,d,l,r; double a1,a2,x1,x2,mid; double A,B,C; double ans; while(scanf("%lf%lf%lf%lf%lf%lf",&a,&b,&c,&d,&l,&r)!=EOF) { a1=fabs(a*l*l*l+b*l*l+c*l+d); a2=fabs(a*r*r*r+b*r*r+c*r+d); ans=max(a1,a2); if(a) { A=3*a; B=2*b; C=c; x1=(-B+sqrt(B*B-4*A*C))/(2*A); x2=(-B-sqrt(B*B-4*A*C))/(2*A); if(x1>=l&&x1<=r) ans=max(ans,fabs(a*x1*x1*x1+b*x1*x1+c*x1+d)); if(x2>=l&&x2<=r) ans=max(ans,fabs(a*x2*x2*x2+b*x2*x2+c*x2+d)); } else { A=b; B=c; C=d; mid=B/(-2*A); ans=max(ans,fabs(A*mid*mid+B*mid+C)); } printf("%.2f\n",ans); } return 0; }