简单二分,但这个不满足单调性。
题目要求极值点,以函数导数的正负作为条件二分即可。
code:
#include<cstdio>
#include<cmath>
double y = 0 ;
double cal(double x){
return 42*pow(x, 6.0) + 48*pow(x, 5.0) + 21*pow(x, 2.0) + 10*x - y ;
}
double solve(double x){
return 6*pow(x, 7.0) + 8*pow(x, 6.0) + 7*pow(x, 3.0) + 5*pow(x, 2.0) - y*x ;
}
int main(){
int t ;
double r, l, m ;
scanf("%d", &t) ;
while(t--){
scanf("%lf", &y) ;
if(cal(100)<=0){ //x=100时若导数小于0,则函数满足单调递减
//因为42*pow(x, 6.0) + 48*pow(x, 5.0) + 21*pow(x, 2.0) + 10*x递增,x=100时有最大值
//不过官方数据好像没有用到这个剪枝
printf("%.4lf\n", solve(100)) ;
continue ;
}
l = 0 ;
r = 100 ;
while(r-l>1e-8){
m = (r + l) / 2 ;
double ans = cal(m) ;
if(ans<0)
l = m ;
else
r = m ;
}
printf("%.4lf\n", solve(m)) ;
}
return 0 ;
}
#include<cmath>
double y = 0 ;
double cal(double x){
return 42*pow(x, 6.0) + 48*pow(x, 5.0) + 21*pow(x, 2.0) + 10*x - y ;
}
double solve(double x){
return 6*pow(x, 7.0) + 8*pow(x, 6.0) + 7*pow(x, 3.0) + 5*pow(x, 2.0) - y*x ;
}
int main(){
int t ;
double r, l, m ;
scanf("%d", &t) ;
while(t--){
scanf("%lf", &y) ;
if(cal(100)<=0){ //x=100时若导数小于0,则函数满足单调递减
//因为42*pow(x, 6.0) + 48*pow(x, 5.0) + 21*pow(x, 2.0) + 10*x递增,x=100时有最大值
//不过官方数据好像没有用到这个剪枝
printf("%.4lf\n", solve(100)) ;
continue ;
}
l = 0 ;
r = 100 ;
while(r-l>1e-8){
m = (r + l) / 2 ;
double ans = cal(m) ;
if(ans<0)
l = m ;
else
r = m ;
}
printf("%.4lf\n", solve(m)) ;
}
return 0 ;
}