这题首先要求出原函数的导函数,注意x,y的范围后,发现在导数为0的地方原函数取得最小值。所以本题要解决的就是求出导数为0的那个点。
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
const double eps=1e-9;
double f(double x,double y)//原函数的导函数
{
double X[7]={1};
for(int i=1;i<7;i++)
X[i]=x*X[i-1];
return 42*X[6]+48*X[5]+21*X[2]+10*X[1]-y;
}
int main()
{
double x,y,result,X[8]={1};
__int64 low,mid,up;
int t;
scanf("%d",&t);
while(t--)
{
scanf("%lf",&y);
low=0;up=100000000000000;//处于精度的考虑,up尽量大一些
while(low<=up)
{
mid=(low+up)/2;
x=mid/1000000000000.0;
result=f(x,y);
if(fabs(result)<eps)
break;
if(result<0)
low=mid+1;
else
up=mid-1;
}
for(int i=1;i<8;i++)
X[i]=X[i-1]*x;
result=6*X[7]+8*X[6]+7*X[3]+5*X[2]-y*x;
printf("%.4lf\n",result);
}
return 0;
}