hdu 2899 導數求最值 浮點數二分
阿新 • • 發佈:2019-02-15
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;
}