CSU-ACM2017暑期训练5-三分 A

来源:互联网 发布:数据库分析工具 编辑:程序博客网 时间:2024/05/01 23:08

题目:

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
2100200
Sample Output
          -74.4291
          -178.8534
 
题目大意:给你一个函数 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)的最小值。
思路:三分用来求单峰函数极值的最基本应用
代码:

#include<cstdio>#include<cstring>#include<algorithm>#include<iostream>#include<string>#include<vector>#include<stack>#include<bitset>#include<cstdlib>#include<cmath>#include<set>#include<list>#include<deque>#include<map>#include<queue>using namespace std;typedef long long ll;const double PI = acos(-1.0);const double eps = 1e-6;const int INF = 1000000000;const int maxn = 100;int T;double mid,midmid;double y;double cal(double x){    return ((((((((6*x)+8)*x+0)*x+0)*x+7)*x+5)*x-y)*x);}int main(){    scanf("%d",&T);while(T--)    {        scanf("%lf",&y);        double l=0,r=100.0;        while(r-l>eps)        {            mid=(l+r)/2.0;            midmid=(mid+r)/2.0;            if(cal(mid)<cal(midmid))            {                r=midmid;            }            else                l=mid;        }        printf("%.4f\n",cal(l));    }    return 0;}