HDU 2899 Strange fuction(二分)

本文提供了一个函数F(x)=6*x^7+8*x^6+7*x^3+5*x^2-y*x在区间[0,100]上的最小值计算方法,包括对F(x)求导,二分查找零点,以及特殊情况处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Description
给出一个函数F(x)=6*x^7+8*x^6+7*x^3+5*x^2-y*x(0<=x<=100),现给出y值,输出F(x)最小值
Input
第一行为一个整数t表示用例组数,每组用例占一行为一个整数y(0 < y < 1e10)
Output
对于每个y值,输出F(x)在区间[0,100]上的最小值,结果保留到小数点后四位
Sample Input
2
100
200
Sample Output
-74.4291
-178.8534
Solution
对F(x)求导后得到其导函数G(x)=42*x^6+48*x^5+21*x^2+10*x-y,显然G(x)在[0,100]上递增,当G(x)有零点时,二分求其零点x0,F(x0)即为最小值;当G(x)无零点,即G(100)<=0时,F(100)即为最小值
Code

#include<stdio.h>
#include<math.h>
#define eps 1e-8
int y;
double g(double x)
{
    return 42.0*pow(x,6)+48.0*pow(x,5)+21.0*pow(x,2)+10.0*x;
}
double f(double x)
{
    return 6.0*pow(x,7)+8.0*pow(x,6)+7.0*pow(x,3)+5.0*pow(x,2)-y*x;
}
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d",&y);
        if(g(100.0)-y<eps)//f(x)递减 
        {
            printf("%.4lf\n",f(100.0));
            continue;
        }
        double l=0,r=100.0,mid;
        while(r-l>=eps)//二分求g(x)零点 
        {
            mid=(l+r)/2.0;
            if(g(mid)-y<eps) l=mid;
            else r=mid;
        }
        printf("%.4lf\n",f(mid));
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值