http://acm.hdu.edu.cn/showproblem.php?pid=2899 解题思路:用到一次求导求单调性,二次求导判断凹凸性,然后二分查找求极值 #include <stdio.h> #include <math.h> #define eps 1e-8 int y; /*一次导数,递增函数*/ double g(double x) { return 42*pow(x,6)+48*pow(x,5)+21*pow(x,2)+10*x; } double f(double x) { return 6*pow(x,7)+8*pow(x,6)+7*pow(x,3)+5*pow(x,2)-y*x;; } int main() { int test; double l,r,m; scanf("%d",&test); while (test--) { scanf("%d",&y); if(g(100.0)-y<=0)/*g(x)为递增的,-y后如果为0,则整个f(x)为递减*/ { printf("%.4lf/n",f(100.0)); continue; } /*算二次导数,可知f(x)为凹函数,存在最小值,然后二分求解*/ l = 0,r = 100; while (r-l>=eps) { m = (r+l)/2; if (g(m)-y<0) l = m; else r = m; } printf("%.4lf/n",f(m)); } return 0; }