1002

来源:互联网 发布:美工的工作内容 编辑:程序博客网 时间:2024/06/18 13:12

简单题意:给定一个公式:6*pow(x,7)+8*pow(x,6)+7*pow(x,3)+5*pow(x,2)-y*x;求所要求的满足公式的最小X值

解题思路:看到这题,第一反应就是和1001很类似,唯一不同的就是多了一个变量y。刚开始的时候我以为,套用第一题的模式就可以,可是后来发现,原式子用二分法,求出的只是一个解。最小解却求不出来。要求最小解,就要用到数学中的导数思想,对原式进行求导,可得42*pow(x,6)+48*pow(x,5)+21*pow(x,2)+10*x-y;无论y取值如何,42*pow(x,6)+48*pow(x,5)+21*pow(x,2)+10*x,是递增的,只需要求出42*pow(x,6)+48*pow(x,5)+21*pow(x,2)+10*x-y=0.的X值。即为原函数的极小值也是最小值,对导函数进行二分法,求出满足42*pow(x,6)+48*pow(x,5)+21*pow(x,2)+10*x-y=0的x值即可

感想:关于数学的问题,忘的差不多了,这里虽然没有牵扯到二次求导,但是原理是一样的,判断导函数递增是需要用到二次求导的,ACM越做越发现和数学的关系密切。能够利用数学知识解决问题,也算是对所学知识的一种应用吧

AC代码:

#include<iostream>
#include<stdio.h>
#include<cmath>
using namespace std;
double y;
const double eps=1e-6;
double func(double x)
{
    return 6*pow(x,7)+8*pow(x,6)+7*pow(x,3)+5*pow(x,2);

}
double fun(double x)
{
    return 42*pow(x,6)+48*pow(x,5)+21*pow(x,2)+10*x;
}
int main()
{
    int T;
    double y;
    cin>>T;
    while(T--)
    {    cin>>y;
      if(y>=func(100))
        cout << func(100)-y*100 << endl;
       else
       {   double low=0,high=100,mid;
            while(high-low>=eps)
            {
                mid=(high+low)/2;
                if(fun(mid)>y)
                high=mid;
                else
                low=mid;
            }

          printf("%.4lf\n",func(mid)-y*mid);}
    }
    return 0;
}

 

0 0