【CUGBACM15级BC第18场 B】hdu 5105 Math Problem

Math Problem

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 3142    Accepted Submission(s): 762


Problem Description
Here has an function:
      (x )=|ax3+bx2+cx+d | (LxR )
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. (10a,b,c,d10,100LR100)
 

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 <bits/stdc++.h>
#define _ ios_base::sync_with_stdio(0);cin.tie(0);
using namespace std;

double a, b, c, d, L, R;
double f(double x)
{
    return abs(a * x * x * x + b * x * x + c * x + d);
}
bool judge(double x)
{
    if (x >= L && x <= R)
    {
        return true;
    }
    else
    {
        return false;
    }
}
int main()
{
    _
    while (cin >> a >> b >> c >> d >> L >> R)
    {
        ///cout << 6.0 / 1.5 * 100 << endl;
        ///cout << 6.0 / (1.5 * 100) << endl;
        double ans = max(f(L), f(R));
        if (a != 0)
        {
            double ter = 4 * b * b - 12 * a * c;
            if (ter <= 0)
            {
                printf("%0.2f\n", ans);
                continue;
            }
            double x1 = (-2 * b + (double)sqrt(ter)) / (6 * a);
            double x2 = (-2 * b - (double)sqrt(ter)) / (6 * a);
            double v;
            if (judge(x1) == true && judge(x2) == true)
            {
                v = max(f(x1), f(x2));
                ans = max(ans, v);
            }
            else if (judge(x1) == true && judge(x2) == false)
            {
                v = f(x1);
                ans = max(ans, v);
            }
            else if (judge(x1) == false && judge(x2) == true)
            {
                v = f(x2);
                ans = max(ans, v);
            }
        }
        else if (a == 0 && b != 0)
        {
            double hh = -c / (2 * b);
            if (judge(hh) == true)
            {
                ans = max(ans, f(hh));
            }
        }
        printf("%0.2f\n", ans);
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值