程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> HDU 2899 Strange fuction (求導解方程+二分查找)

HDU 2899 Strange fuction (求導解方程+二分查找)

編輯:關於C++

 

【題目大意】:

Now, here is a fuction: F(x) = 6 * x^7+8*x^6+7*x^3+5*x^2-y*x (0 <= x <=100) Can you find the minimum value when x is between 0 and 100.給你一個方程,求其給定范圍內的最小值。

【解題思路】:

首先,對該式子,求一階導,得到F'(x) = 42*x^6 + 48*x^5+21*x^2+10*x-y,這裡,我們忽略y,可發現,導函數42*x^6 + 48*x^5+21*x^2+10*x是遞增的,范圍在[0, 10^13],
所以我們可以發現無論y取什麼值,總可以找到x1∈[0, 100],使F'(x1)=0,又因為此時x∈[0, x1]時,函數遞減(導函數小於零,原函數遞減,反之,遞增);x∈[x1, 100]時,函數遞增。所以F(x1)便是極小值,也是最小值。綜上,先對F'(x)使用二分法即可,最後結果輸出F(x)的值即可

代碼:

#include 
using namespace std;
const double eps=1e-6;
int t;
double y;
double fun(double x)
{
    return 6*pow(x,7)+8*pow(x,6)+7*pow(x,3)+5*pow(x,2)-y*x;
}
double func(double x)
{
    return 42*pow(x,6)+48*pow(x,5)+21*pow(x,2)+10*x-y;
}
int main()
{
    //freopen(1.txt,r,stdin);
    scanf(%d,&t);
    while(t--)
    {
        scanf(%lf,&y);
        double ll=0,rr=1e2,mid;
        while(ll+eps<=rr){
            mid=(ll+rr)/2;;
            if(func(mid)>0) rr=mid;
             else ll=mid;
        }
        printf(%.4f
,fun(mid));
    }
    return 0;
}

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved