hdu5105Math Problem(分类讨论)

2015-01-27 06:22:00 · 作者: · 浏览: 8

题目链接:

huangjing

题目:

思路:

给出的是一个方程,首先讨论最高项系数。
1:a==0&& b==0 那么函数就是线性的,直接比较端点即可。

2 a==0&&b!=0 那么函数就是二次函数,直接算出特征值,然后比较端点值即可。。

3 a!=0 又有几种情况,那么当特征根 b*b-4*a*c<0 时 说明愿函数是单调,直接比较端点值即可。。

当大于0的时候,直接求出两个根,然后和端点值比较即可

ps:所有的特征根都要是有效的,即都要在[L,R]之间。。



题目:

Math Problem

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


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
Recommend heyang | We have carefully selected several similar problems for you: 5106 5103 5102 5101 5100
Statistic | Submit | Discuss | Note

代码:

#include
  
   
#include
   
     #include
    
      #include
     
       #include
       #include
       
         #include
        
          #include
         
           #include
          
            #define eps 1e-9 #define ll long long #define INF 0x3f3f3f3f using namespace std; priority_queue
           
            ,greater
            
              >Q; double a,b,c,d,l,r; double f(double x) { return fabs(a*x*x*x+b*x*x+c*x+d); } int main() { double ans; while(~scanf("%lf%lf%lf%lf%lf%lf",&a,&b,&c,&d,&l,&r)) { if(a==0&&b!=0) { double x=-c/(2*b); ans=max(f(l),f(r)); if(x>=l&&x<=r) ans=max(ans,f(x)); } else if(a==0&&b==0) ans=max(f(l),f(r)); else if(a!=0) { double xx=4*b*b-12*a*c; if(xx<0) ans=max(f(l),f(r)); else { double x1=(-2*b+sqrt(xx))/(6*a); double x2=(-2*b-sqrt(xx))/(6*a); ans=max(f(l),f(r)); if(x1>=l&&x1<=r) ans=max(ans,f(x1)); if(x2>=l&&x2<=r) ans=max(ans,f(x2)); } } printf("%.2lf\n",ans); } return 0; }