题目链接: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; }