Math Problem
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 586 Accepted Submission(s): 142
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).
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
Source
BestCoder Round #18
一道纯粹数学题,关于3次方函数求极致,运用求导以及简单的函数图像方面的知识。同数学求解的思路一样需要区分三种情况来做这道题目。
S
#include
#include
#include
int main()
{
double a, b, c, d, L, R, x, ans;
while(scanf("%lf%lf%lf%lf%lf%lf", &a, &b, &c, &d, &L, &R) != EOF)
{
ans = -1;
if (a != 0)
{
if ((4 * b * b - 12 * a * c) >= 0)
{
x = (-2 * b + sqrt(4 * b * b - 12 * a * c)) / (6 * a);
if (x >= L && x <= R)
{
x = abs(a * x * x * x + b * x * x + c * x + d);
if(x > ans) ans = x;
}
x = (-2 * b - sqrt(4 * b * b - 12 * a * c)) / (6 * a);
if (x >= L && x <= R)
{
x = abs(a * x * x * x + b * x * x + c * x + d);
if(x > ans) ans = x;
}
x = abs(a * L * L * L + b * L * L + c * L + d);
if(x > ans) ans = x;
x = abs(a * R * R * R + b * R * R + c * R + d);
if(x > ans) ans = x;
}
else
{
x = abs(a * L * L * L + b * L * L + c * L + d);
if(x > ans) ans = x;
x = abs(a * R * R * R + b * R * R + c * R + d);
if(x > ans) ans = x;
}
}
else if (a == 0 && b != 0)
{
x = -c / (2 * b);
x = abs(a * x * x * x + b * x * x + c * x + d);
if(x > ans) ans = x;
x = abs(a * L * L * L + b * L * L + c * L + d);
if(x > ans) ans = x;
x = abs(a * R * R * R + b * R * R + c * R + d);
if(x > ans) ans = x;
}
else
{
x = abs(a * L * L * L + b * L * L + c * L + d);
if(x > ans) ans = x;
x = abs(a * R * R * R + b * R * R + c * R + d);
if(x > ans) ans = x;
}
printf("%.2lf
", ans);
}
return 0;
}