Hdu 2899 Strange fuction二分法

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2899

//多项式求导可以减少乘法的计算次数
//找出f(x)的最小值
//可证明f(x)在0-x0单调递减,在x0-100单调递增

//题目转化为求f(x)的极值点x0
//即f'(x)的零点x0
//显然f'(x)递增
//用二分法求零点
//直到右边界-左边界<1e-8(貌似要开到1e-6才不会有错)
//要注意分类讨论

#include<iostream>
#include<iomanip>
#include<cmath>
using namespace std;
#define INFINI 1<<31

int t;
double y;
double ans;

double cal(double x){
    return 42*pow(x,6)+48*pow(x,5)+21*x*x+10*x-y;
}

double f(double x){
    return 6*pow(x,7)+8*pow(x,6)+7*pow(x,3)+5*x*x-y*x;
}

double lt,rt,mid;
//f'(0)=-y
//f(0)=0

int main (){

    cin>>t;
    while(t--){
        cin>>y;
        
        if(y<=0)             //x0<=0
            ans=0;
        if(cal(100)<=0)        //x0>=100
            ans=f(100);

        // 0<x0<100
        lt=0;
        rt=100;
        
        while(rt-lt>1e-8)
        {
            mid=(lt+rt)/2;
            double temp=cal(mid);
            if(temp>0)
                rt=mid;
            else if(temp<0)
                lt=mid;
            else                     //此时mid为极值点
                rt=lt=mid;
        }
        cout<<fixed<<setprecision(4);
        cout<<f(mid)<<endl;
    }
    return 0;
}

 

posted @ 2014-01-31 11:54  neverchanje  阅读(186)  评论(0编辑  收藏  举报