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);
    }
}
相關文章
相關標籤/搜索