题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2899
#include <stdio.h> #include <math.h> double func1(double x) {//一次求导,func1递增 return 42*pow(x,6)+48*pow(x,5)+21*x*x+10*x; } double func2(double x,int y) { return 6*pow(x,7)+8*pow(x,6)+7*x*x*x+5*x*x-y*x; } int main() { int test,y; double right,left,mid; scanf("%d",&test); while(test--) { scanf("%d",&y); if(func1(100.0)-y<=0)//判断函数单调性 { printf("%.4lf\n",func2(100.0,y)); continue; } left=0.0;//函数的二次导数得函数为凹函数,有最小值 right=100.0; while(right-left>=1e-8) { mid=(left+right)/2.0; if(func1(mid)-y<0) left=mid; else right=mid; } printf("%.4lf\n",func2(mid,y)); } return 0; }
#include <stdio.h> #include <math.h> double func(double x,double y) { return 6*pow(x,7)+8*pow(x,6)+7*x*x*x+5*x*x-y*x; } int main() { int test; double left,right,leftThrid,rightThrid,y; scanf("%d",&test); while(test--) { scanf("%lf",&y); left=0.0; right=100.0; while(right-left>=1e-8) { leftThrid=(2*left+right)/3.0; rightThrid=(left+2*right)/3.0; if(func(leftThrid,y)>func(rightThrid,y)) left=leftThrid; else right=rightThrid; } printf("%.4lf\n",func(left,y)); } return 0; }