hdu 2899(数学基础+二分)

题意:给了你一个函数,然后给了你x的变化范围,让你求出函数的最小值。

分析:它让你求的是函数的最小值,所以我们可以先对函数求导,得到的导数就可以判断函数的单调性了,求出导数后,我们发现如果函数的导数是x越大所求的的导数也就越大,

当导数一直为负数时,函数是单调递减的;当导数开始是负数,然后是正数,那说明函数开始时递减的然后是递增的,那么当导数为0时函数值肯定是最小的!我们求导数为0的

过程,我们可以用二分实现!

代码实现:

#include<stdio.h>
#include<string.h>
#include<math.h>
#define eps 1e-8

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

double f(double x)
{
    return 6*pow(x,7)+8*pow(x,6)+7*pow(x,3)+5*pow(x,2);
}

int main()
{
    int T;
    double y,l,r,mid;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%lf",&y);
        if(g(100.00)-y<=0)
         printf("%.4lf\n",f(100.00)-y*100.00);
        else
        {
            l=0;r=100;
            while(l+eps<=r)
            {
                mid=(l+r)/2;
                if(g(mid)-y<0)
                 l=mid;
                else if(g(mid)-y>0)
                 r=mid;
                else if(g(mid)-y<eps)
                 break;
            }
            printf("%.4lf\n",f(mid)-y*mid);
        }
    }
    return 0;
}

 

 

posted on 2013-10-01 21:12  后端bug开发工程师  阅读(333)  评论(0编辑  收藏  举报

导航