HDU 5105 Math Problem --数学,求导

官方题解:

f(x)=|a∗x3+b∗x2+c∗x+d|, 求最大值。令g(x)=a∗x3+b∗x2+c∗x+d,f(x)的最大值即为g(x)的正最大值,或者是负最小值。a!=0时,

g′(x)=3∗a∗x2+2∗b∗x+c 求出g′(x)的根(若存在,x1,x2,由导数的性质知零点处有极值。ans=max(f(xi)|L≤xi≤R).然后考虑两个端点的特殊性有ans=max(ans,f(L),f(R)).

当时 x = -c/(2*b) 写成 x = -c/2*b 了,然后过pretest了。 然后。。你敢信?

代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <algorithm>
#define eps 1e-8
using namespace std;
#define N 50017

int sgn(double x)
{
    if(x > eps) return 1;
    if(x < -eps) return -1;
    return 0;
}

double a,b,c,d,L,R;

double calc(double x) { return fabs(a*x*x*x + b*x*x + c*x + d); }

int main()
{
    while(scanf("%lf%lf%lf%lf%lf%lf",&a,&b,&c,&d,&L,&R)!=EOF)
    {
        if(sgn(a) == 0)
        {
            if(sgn(b) == 0)
            {

                if(sgn(fabs(calc(L))-fabs(calc(R))) >= 0)
                    printf("%.2f\n",calc(L));
                else
                    printf("%.2f\n",calc(R));
            }
            else
            {
                double X = -c/(2.0*b);
                double k1 = calc(L);
                double k2 = calc(R);
                double k3;
                if(sgn(X-L) >= 0 && sgn(X-R) <= 0)
                    k3 = calc(X);
                else
                    k3 = 0.0;
                printf("%.2f\n",max(max(k1,k2),k3));
            }
            continue;
        }
        double delta = 4.0*b*b - 12.0*a*c;
        if(sgn(delta) <= 0)
        {
            if(sgn(fabs(calc(L))-fabs(calc(R))) >= 0)
                printf("%.2f\n",calc(L));
            else
                printf("%.2f\n",calc(R));
        }
        else
        {
            double X1 = (-2.0*b + sqrt(delta))/(6.0*a);
            double X2 = (-2.0*b - sqrt(delta))/(6.0*a);
            double k1 = calc(L);
            double k2 = calc(R);
            double k3,k4;
            if(sgn(X1-L) >= 0 && sgn(X1-R) <= 0)
                k3 = calc(X1);
            else
                k3 = 0.0;
            if(sgn(X2-L) >= 0 && sgn(X2-R) <= 0)
                k4 = calc(X2);
            else
                k4 = 0.0;
            printf("%.2f\n",max(max(max(k1,k2),k3),k4));
        }
    }
    return 0;
}

时间: 2024-11-24 18:17:48

HDU 5105 Math Problem --数学,求导的相关文章

hdu 5105 Math Problem(数学)

题目链接:hdu 5105 Math Problem 题目大意:给定a,b,c,d,l,r,表示有一个函数f(x)=|a?x3+b?x2+c?x+d|(L≤x≤R),求函数最大值. 解题思路:考虑极点即可,将函数求导后得到f′(x)=0的x,即为极值点.在极值点处函数的单调性会发生变化,所以最大值一定就在区间边界和极值点上.注意a=0,b=0的情况,以及极值点不在区间上. #include <cstdio> #include <cstring> #include <cmath

HDU 5105 Math Problem(数学)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5105 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

HDU 5105 Math Problem

让求  f(x)=|a∗x3+b∗x2+c∗x+d|(L≤x≤R)的最大值 这个题目讨论a和b的值,如果a==0的话,那么这个方程就变成了一个一元二次方程,直接找端点和对称轴(如果对称轴在给定的区间内)处的函数值就行,如果a != 0,那么求导,求导之后判断二次方程的delta,如果delta小于等于0,说明是单调的,那么最值还是端点处取到,如果delta大于0, 那么就要比较两个极点(如果极点在给定的区间内)处的值和端点值的大小就行了. /***************************

hdu 6182A Math Problem(快速幂)

You are given a positive integer n, please count how many positive integers k satisfy kk≤nkk≤n. InputThere are no more than 50 test cases. Each case only contains a positivse integer n in a line. 1≤n≤10^18OutputFor each test case, output an integer i

1010. 一元多项式求导 (25) (ZJUPAT 数学求导)

题目链接:http://pat.zju.edu.cn/contests/80/1010 设计函数求一元多项式的导数. 输入格式:以指数递降方式输入多项式非零项系数和指数(绝对值均为不超过1000的整数).数字间以空格分隔. 输出格式:以与输入相同的格式输出导数多项式非零项的系数和指数.数字间以空格分隔,但结尾不能有多余空格. 输入样例: 3 4 -5 2 6 1 -2 0 输出样例: 12 3 -10 1 6 0 代码如下: #include <cstdio> #include <cma

hdu 5170 GTY&#39;s math problem(水,,数学,,)

题意: 给a,b,c,d. 比较a^b和c^d的大小 思路: 比较log(a^b)和log(c^d)的大小 代码: int a,b,c,d; int main(){ while(scanf("%d%d%d%d",&a,&b,&c,&d)!=EOF){ double x1 = b*log((double)a); double x2 = d*log((double)c); if(fabs(x1-x2)<eps){ puts("=")

BestCoder18 1002.Math Problem(hdu 5105) 解题报告

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5105 题目意思:给出一个6个实数:a, b, c, d, l, r.通过在[l, r]中取数 x,使得这个函数 f(x)= |a∗x3+b∗x2+c∗x+d| 最大. 我一开始做的时候,很天真的认为数据量这么小,一个一个试,暴力搜就肯定能得到答案啦.但是一个很严重的问题是,x 没有说是实数还是整数,所以枚举根本不可行. 于是就联想到应该使用高中求一元三次方程的方法来做.我当时是直接从 f(l), f

hdu 1757 A Simple Math Problem (乘法矩阵)

A Simple Math Problem Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 2441    Accepted Submission(s): 1415 Problem Description Lele now is thinking about a simple function f(x).If x < 10 f(x) =

矩阵十题【八】 HDU 1715 A Simple Math Problem

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1757 题目大意: If x < 10   ,则  f(x) = x. If x >= 10 ,则  f(x) = a0 * f(x-1) + a1 * f(x-2) + a2 * f(x-3) + -- + a9 * f(x-10); 给出k,m和a0~a9,求f(k)%m,  k<2*10^9 , m < 10^5 这是一个递推式,故可以用矩阵乘法来求 和上题类似,具体思路过程见上题