acm解题报告 HDU 2899 Strange fuction

首先将方程求导,发现从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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值