首页 > 其他 > 详细

hdu 2899(数学基础+二分)

时间:2020-02-09 00:18:40      阅读:87      评论:0      收藏:0      [点我收藏+]

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

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

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

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

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

#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);
    }
}

 

hdu 2899(数学基础+二分)

原文:https://www.cnblogs.com/rtyxxy/p/12285460.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!