您的位置:首页 > 其它

acm解题报告 HDU 2899 Strange fuction

2015-07-23 09:53 543 查看
首先将方程求导,发现从0到导数为零的范围,原方程递减,之后方程递增,所以求出导数为0的点即为最小值点,与

HDU 2199 类似,通过二分的方法找到精确的最小值点,然后带到原方程中即得到最小值。

源代码:

#include<stdio.h>

double cal1(double x, double y){

 double a = 6 * x*x*x*x*x*x*x + 8 * x*x*x*x*x*x + 7 * x*x*x + 5 * x*x - x*y;

 return a;

}

double cal2(double x){

 double a = 42 * x*x*x*x*x*x + 48 * x*x*x*x*x + 21 * x*x + 10 * x;

 return a;

}

int main(){

 int t;

 scanf("%d", &t);

 while (t--){

  double y;

  scanf("%lf", &y);

  if (y >= 42480000211000)printf("%.4f", cal1(100, y));

  else if (y <= 0)printf("%.4f", 0 * y);

  else {

   double high = 100, mid = 50, low = 0;

   while ((high - low) >= 0.000005){

    if (cal2(mid) > y){

     high = mid;

     mid = (high + low) / 2;

    }

    else {

     low = mid;

     mid = (high + low) / 2;

    }

   }

   printf("%.4f\n", cal1(mid, y));

  }

 }

 return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  acm 二分