求的是函数的最小值6 * x^7+8*x^6+7*x^3+5*x^2-y*x,这个式子的最小值,很明显数学知识,当然的导数等于0的时候就是转折点。他的导数42X^6+48X^5+21X^2+10X-Y很明显只有一个转折点所以在这里取得最小值,实际上就是求他的导数等于0时候的值。这一题用三分法也是可以的。用导数更直接。
#include<iostream> using namespace std; #include<stdio.h> #include<cmath> const double L=1e-8; double y; double f(double x) { return 42*pow(x,6)+48*pow(x,5)+21*pow(x,2)+10*x-y; } int main() { int T; double x; cin>>T; while(T--) { scanf("%lf",&y); if(y<=0){cout<<"0.0000"<<endl;continue;} double low=0,high=100; double mid=(low+high)/2; while(high-low>L) { double M=f(mid); //if(abs(M-y)<L)break; if(M<0)low=mid+L; else high=mid-L; mid=(low+high)/2; } x=(low+high)/2; printf("%.4lf\n",6 * pow(x,7)+8*pow(x,6)+7*pow(x,3)+5*x*x-y*x); } return 0; }