hdu 2899(数学基础+二分)

题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=2899php

题意:给了你一个函数,而后给了你x的变化范围0到100,让你求出函数的最小值。c++

分析:它让你求的是函数的最小值,因此咱们能够先对函数求导,获得的导数就能够判断函数的单调性了,求出导数后,咱们发现若是函数的导数是x越大所求的的导数也就越大,函数

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

过程,咱们能够用二分实现!code

#include <bits/stdc++.h>
#define eps 1e-7 //该常量为精度
#define F 6*pow(x,7)+8*pow(x,6)+7*pow(x,3)+5*pow(x,2)-y*x
#define DF 42*pow(x,6)+48*pow(x,5)+21*pow(x,2)+10*x-y //导数,函数随着x增大单调递增
using namespace std;  
int main() {
    int n;
    double y;
    double x,l,r;//x为变量
    cin>>n;    
    while(n--) {
        cin>>y;
        l=0.0;
        r=100.0;
        while(r-l>=eps) {
            x=(l+r)/2;//范围的中间值
            if(DF<0) {//当导数小于0,符合函数等于0的x必定在中间值的右边
                l=x;
            }
            else if(DF>0) {//当导数大于0,符合函数等于0的x必定在中间值的左边
                r=x;
            }
            else if(DF<eps) {//当DF小于最小精度时可近似认为导数值等于0了,即获得咱们要求的x,
                break;
            }
        }
        printf("%.4lf\n",F);
    }
}
相关文章
相关标签/搜索