//三分 2899
/*
题意: 求函数F(x) = 6*x^7 + 8*x^6 + 7*x^3 + 5*x^2 - y*x 的最小值,
其中 0 <= x <=100 , y为给定的测试数据(real number实数),0 < Y <1e10
思路: 先给F(x)求导
F(x)' = 42*x^6 + 48*x^5 + 21*x^2 + 10*x - y
F(x)'' = 252*x5 + 240*x^4 + 42*x + 10
观察上面两个导函数,可知:
一次导函数为先负后正,二次导函数F(x)''>0即一次导函数单调,
因此F(x)在定义域范围内是:单峰凹函数,故三分(需要在区间内取两个值(划分成三段)才能知道正确答案落在哪个区段)
*/
#include <stdio.h>
double y; //全局变量
double f(double x){
return 6*x*x*x*x*x*x*x + 8*x*x*x*x*x*x + 7*x*x*x + 5*x*x - y*x;
}
//得出F(x)在区间内的最小值---凹顶点的值
double solve(double left, double right){
double eps=1e-7;
while( left+eps < right ){
double lmid=left+(right-left)/3;
double rmid =right-(right-left)/3;
if( f(lmid)<f(rmid) ){ //凹顶点在左区
right = rmid;
}
else{ //凹顶点在右区
left = lmid;
}
}
return f(left);
}
int main(){
int t;
scanf("%d",&t);
while(t--){
scanf("%lf",&y);
printf("%.4f\n", solve(0,100.0) );
}
return 0;
}
HDU2899
猜你喜欢
转载自blog.csdn.net/xxf_is_girl_gad/article/details/80633233
今日推荐
周排行