日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

hdoj2899

發布時間:2024/3/13 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 hdoj2899 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Strange fuction

Time Limit : 2000/1000ms (Java/Other)???Memory Limit : 32768/32768K (Java/Other)

Total Submission(s) : 14???Accepted Submission(s) : 12

Font:?Times New Roman?|?Verdana?|?Georgia

Font Size:?←?→

Problem Description

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.

Input

The first line of the input contains an integer T(1<=T<=100) which means the number of test cases. Then T lines follow, each line has only one real numbers Y.(0 < Y <1e10)

Output

Just the minimum value (accurate up to 4 decimal places),when x is between 0 and 100.

Sample Input

2 100 200

Sample Output

-74.4291 -178.8534

?

這題..

首先double類型的判斷大小不能直接用==這些來判斷 可以define一個eps為1e-6

#define eps 1e-6 if(fabs(a-b)<eps)//判斷是否相等

這題好像有兩種方法 暫時只寫出一種?

要求原函數的最小值 就是導函數為0的時候 原函數的二階導恒大于0 所以導函數是單調遞增的 某種方面可以說他是有序的一個序列 那就可以用二分查找 要繞過導函數為0 把算式轉換一下就是 我下面寫的ff()要等于y

ac代碼:

#include<iostream> #include<cmath> #define eps 1e-6 double y; double f(double x)//原函數 {return 6*pow(x,7)+8*pow(x,6)+7*pow(x,3)+5*pow(x,2)-x*y; } double ff(double x)//導函數 {return 42*pow(x,6)+48*pow(x,5)+21*pow(x,2)+10*x; } int main() {using namespace std;int T,N;cin>>T;while(T--){cin>>y;double l=0,r=100,mid;while(l+eps<r){mid=(l+r)/2;if(ff(mid)<y)l=mid;elser=mid;}printf("%.4lf\n",f(mid));}return 0; }

?

再放下老師的三分查找吧

/*hdu2899 三分題意:求函數F(x) = 6 * x^7+8*x^6+7*x^3+5*x^2-y*x (0 <= x <=100)的最小值,y為給定的實數,x連續實數且在[0,100]范圍內思路:函數F(x)的一階導數F'為先負后正,二階導數F''>0即一階導數單調,由此可得F(x)為單峰凹函數,因此可用三分來解。 */ #include<stdio.h> double y;double f(double x) {return 6*x*x*x*x*x*x*x+8*x*x*x*x*x*x+7*x*x*x+5*x*x-y*x; }//在區間[l,r)范圍內查找函數F(x)的凹點(最小值)----三分 double solve(double l, double r) {double eps = 1e-7;//一個非常小的常量while( l+eps <r) //當[l,r]的區間長度非常非常小的時候,我們就認為已經找到答案{double lmid = l +(r-l)/3, rmid = r-(r-l)/3;if( f(lmid) <f(rmid) )//查找目標在左半區(2/3),把右半區(1/3)丟掉r = rmid;//目標一定在[l,rmid)else//查找目標在右半區(2/3),把左半區(1/3)丟掉l = lmid;//目標一定在[lmid,r)}return f(l); }int main() {int t;scanf("%d",&t);while(t--){scanf("%lf",&y);printf("%.4lf\n", solve(0,100.0) );} }

?

總結

以上是生活随笔為你收集整理的hdoj2899的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。