HDU 2899 Strange fuction

题目地址:点击打开链接

思路:先求导看单调性,不可能有单增的情况,因为y的取值大于0小于1e10,有单调递减的情况,100处为最小值,对函数二次求导大于0,原函数为凹函数,导函数为递增函数,导函数图像如下图,导函数y值为0时,值最小,所以左右值的差小于精度即可求出值

HDU 2899 Strange fuction_第1张图片

AC代码:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

double y;

double dao(double x)
{
    return 42 * pow(x,6) + 48 * pow(x,5) + 21 * pow(x,2) + 10 * x;
}

double shu(double x)
{
    return 6 * pow(x,7) + 8 * pow(x,6) + 7 * pow(x,3) + 5 * pow(x,2) - y * x;//注意圆角半角别敲错
}

int main()
{
    int t;
    double left,right,mid;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%lf",&y);
        if(dao(100.0) - y <= 0)//单调递减,等于零是有可能在100处取到极值点
        {
            printf("%.4lf",shu(100.0));
            continue;
        }
        left = 0.0;
        right = 100.0;
        while(right - left > 1e-5)//-4不行,得-5,不然会错误
        {
            mid =  (left + right) / 2;
            if(dao(mid) - y < 0)
                left = mid;
            else
                right = mid;
        }
        printf("%.4lf\n",shu(mid));
    }
    return 0;
}

1e-10就是“aeb”的形式,表示a乘以10的b次方。其中b必须是整数,a可以是小数

你可能感兴趣的:(HDU 2899 Strange fuction)