(二分) Strange fuction--HDOJ

来源:互联网 发布:康佳lc47d560dc 网络 编辑:程序博客网 时间:2024/05/19 20:41

Strange fuction
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 749 Accepted Submission(s): 609

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

Author
Redow

Recommend
lcy

总结:
输入y之后,函数只剩下x一个变量,求函数的最小值,先对其求导,得到F’ = 42 * x^6+48*x^5+21*x^2+10*x-y(0 <= x <=100)
可以看出导函数是递增的,当x比较小的时候,导函数的值是小于零的,x比较大时,导函数是大于零的,也就是说,F函数是先减后增的,那么导函数等于零的时候,也就是F函数最小的时候。从0到100找到一个值,可以用二分的思路来做,精度控制在1e-6就可以了

#include<iostream>#include<algorithm>#include<string.h>#include<stdio.h>#include<string>#include<math.h>using namespace std;double F(double x,double y){    return 42*pow(x,6)+48*pow(x,5)+21*pow(x,2)+10*x-y;}int main(void){  //  freopen("in.txt","r",stdin);    int ncase;    cin >> ncase;    while(ncase--)    {        double y,tmp,ans=0;        scanf("%lf",&y);        double st=0,ed=100,mid;        while((ed-st) > 0.000001)        {            mid = (st + ed) / 2;            if(F(mid,y) > 0)                ed = mid;            else                st = mid;        }        ans = 6*pow(st,7)+8*pow(st,6)+7*pow(st,3)+5*st*st-y*st;        printf("%.4lf\n",ans);    }    return 0;}