Math Problem
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 2518 Accepted Submission(s): 605
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
思路:直接求导判断是否有极值即可
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
#define eps 1e-8
int main()
{
double a,b,c,d,l,r;
while(~scanf("%lf %lf %lf %lf %lf %lf",&a,&b,&c,&d,&l,&r))
{
double ans;
ans=max(fabs(a*l*l*l+b*l*l+c*l+d),fabs(a*r*r*r+b*r*r+c*r+d));
if(fabs(a)<=eps&&fabs(b)>eps)
{
double k=-c/(2*b);
if(k>l&&k<r)
ans=max(ans,fabs(b*k*k+c*k+d));
}
else
{
if(4*b*b-12*a*c>=0)
{
double q=sqrt(4*b*b-12*a*c);
double x1=(-2*b-q)/(6*a),x2=(-2*b+q)/(6*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));
}
}
printf("%.2lf\n",ans);
}
return 0;
}