1. 程式人生 > >hdu 2899 導數求最值 浮點數二分

hdu 2899 導數求最值 浮點數二分

F(x) = 6 * x^7+8*x^6+7*x^3+5*x^2-y*x (0 <= x <=100)
求最小值
導數求導,導數是一個遞增函式,當F’(x0)=0,求x0,該點是極值點也是最小值點。用二分找該點,浮點數的二分。

double eps = 1e-6;
while(right-left>=eps){ 
    mid=(left+right)/2;
    double temp=der(mid);
    if(temp<y)
        left=mid;
    else
                right=mid;
}
#include <iostream>
#include <stdio.h> #include <algorithm> #include <string.h> #include <math.h> #define ll long long using namespace std; double eps = 1e-6; double x,y; double der(double dx){ return 42*pow(dx,6)+48*pow(dx,5)+21*pow(dx,2)+10*dx; } int main() { int m; while(~scanf("%d"
,&m)){ while(m--){ scanf("%lf",&y); double left=0,right=100,mid; while(right-left>=eps){ mid=(left+right)/2; double temp=der(mid); if(temp<y) left=mid; else right=mid; } double
ans=6*pow(mid,7)+8*pow(mid,6)+7*pow(mid,3)+5*pow(mid,2)-y*mid; printf("%.4f\n",ans); } } return 0; }