通常解法是二分查找其导数为0的点,然后求极值。
#include <cstdio>
#include <cmath>
using namespace std;
#define eps 1e-6
double F(double x,double y){//求值
return 6*pow(x,7)+8*pow(x,6)+7*pow(x,3)+5*pow(x,2)-y*x;
}
double f(double x){//对x求导
return 42*pow(x,6)+48*pow(x,5)+21*pow(x,2)+10*x;
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
double y;
scanf("%lf",&y);
double left=0,right=100,mid;
while(right-left>eps)
{
mid=(left+right)/2;
if(f(mid)<y) left=mid;
else right=mid;
}
printf("%.4lf\n",F(mid,y));
}
return 0;
}
三分查找适用于凹凸性质的函数的极值的查找。
在寻找极值的问题当中,二分查找时最常用的方法,但是他只适用于单调函数。
当函数是凹凸函数时,就可以考虑用三分查找。
#include <cstdio>
#include <cmath>
using namespace std;
#define eps 1e-6
double F(double x,double y){//求值
return 6*pow(x,7)+8*pow(x,6)+7*pow(x,3)+5*pow(x,2)-y*x;
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
double y;
scanf("%lf",&y);
double left=0,right=100,mid,midmid;
while(right-left>eps)
{
mid=(left+right)/2;
midmid=(mid+right)/2;
if(F(mid,y)<F(midmid,y)) right=midmid;
else left=mid;
}
printf("%.4lf\n",F(mid,y));
}
return 0;
}