HDU2899

//三分 2899
/*
   题意: 求函数F(x) = 6*x^7 + 8*x^6 + 7*x^3 + 5*x^2 - y*x 的最小值,
         其中 0 <= x <=100  , y为给定的测试数据(real number实数),0 < Y <1e10
   思路: 先给F(x)求导
   F(x)' = 42*x^6 + 48*x^5  + 21*x^2  + 10*x - y
   F(x)'' = 252*x5 + 240*x^4 + 42*x + 10

   观察上面两个导函数,可知:
   一次导函数为先负后正,二次导函数F(x)''>0即一次导函数单调,
   因此F(x)在定义域范围内是:单峰凹函数,故三分(需要在区间内取两个值(划分成三段)才能知道正确答案落在哪个区段)

*/

#include <stdio.h>
double y; //全局变量

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

//得出F(x)在区间内的最小值---凹顶点的值
double solve(double left, double right){
   double eps=1e-7;
   while( left+eps < right ){
      double lmid=left+(right-left)/3;
      double rmid =right-(right-left)/3;
      
      if( f(lmid)<f(rmid) ){ //凹顶点在左区
         right = rmid;
      }
      else{ //凹顶点在右区
         left = lmid;
      }
   }
   return f(left);
}

int main(){
  int t;
  scanf("%d",&t);
  while(t--){
    scanf("%lf",&y);
    printf("%.4f\n", solve(0,100.0) );
  }

  return 0;
}


猜你喜欢

转载自blog.csdn.net/xxf_is_girl_gad/article/details/80633233