1002-Strange fuction

1.序号:1002-Strange fuction

2.题意:给出一个方程,F(x) = 6 * x^7+8*x^6+7*x^3+5*x^2-y*x ,其中x在0到100之间,第一行输入一个T,代表输入几个数据Y,,Y即为方程中的y,然后在0<=x<=100的范围内求方程F(x)的最小值,输出最小值。

3.解题思路:这道题与1001那道题很相似。对方程进行一次求导,就是每个点的斜率,就像路程S求一次导就是速度V一样,v为负,s就变小,v为正,s就大。首先定义了两个方程,equ_fir是原方程,equ是求导后的方程,对于求导后的方程有三种情况,第一当y很大,x=100的时候方程也为负,说明方程在0<=x<=100的范围内一直为负,那方程就是一直递减的,当x=100的时候最小,第二当y很小,x=0的时候方程也为正,说明方程在0<=x<=100的范围内一直为正,那方程就是一直递增的,第三就是方程先减后增,要求方程=0的解,这与1001题一样,求出=0的解将这个解带入原方程就是最终的输出。

4.感想:这道题跟1001那道前面几乎都一样,就是在后面又加上一些步骤,基本上一样的,做这道题觉得acm与数学就是联系在一起的,acm主要是算法问题,今天这道题的求导问题,我当时就在想,求一次还是求两次,用了路程、速度、加速度做例子想了一下,数学好多题都有一些遗忘了,希望能把它们慢慢拾起来。

5.AC代码:

#include <iostream>
#include <stdio.h>
#include <cmath>
using namespace std;

double equ_fir(double x,double y)
{
    return 6*pow(x,7)+8*pow(x,6)+7*pow(x,3)+5*x*x-x*y;
}
double equ(double x)
{
    return 42*pow(x,6)+48*pow(x,5)+21*x*x+x*10;
}

int main()
{
    int n;
    double ans;
    double y;
    cin>>n;
    for(int i=0;i<n;i++)
    {
        double l=0,h=100,mid,co;
        cin>>y;
        if(y<equ(0))
        {
           cout<<equ_fir(0,y)<<endl;
            continue;
        }
         else if(y>equ(100))
        {
           cout<<equ_fir(100,y)<<endl;
            continue;
        }
        else
        {
            while(h-l>1e-8)
            {
                mid=(h+l)/2;
                if(equ(mid)<y)
                    {l=mid;}
                 else if(equ(mid)>y)
                    {h=mid;}
                else {l=mid;h=mid;}
            }
             ans=equ_fir((h+l)/2,y);
                printf("%.4lf\n",ans);
        }
    }
    return 0;
}

你可能感兴趣的:(1002-Strange fuction)