对于一个x变量满足,二分是满足单调性找到离其最近的值。
而三分就是一个凸函数,满足某个点离结果最近,其他两端结果都是递增
那么对于一个范围left1,right1,可以二分mid1=(left1+right1)/2,mid2=(mid1+right1)/2.
这样如果mid2>=mid1那么显然答案在区间left1,mid2之间(因为mid1的结果比较小)
然后反之一样,求最小值,下面是模版
#include<cstdio>
#include<cmath>
#include<iostream>
#define eps 1e-6
using namespace std;
double a,b,c,x,y;
double left1,right1,p,mid1,mid2,k1,k2,ans1,ans2;
double X,Y;
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(){
//freopen("in.txt","r",stdin);
int T;
scanf("%d",&T);
while(T--){
//cin >> a >> b>>c>> X>>Y;
scanf("%lf",&Y);
left1=0;right1=100; //三分x,有x就有y,那么就有了距离的答案,这个答案满足三分的凸性
while(right1-left1>=eps){
// cout <<left1 <<" "<<right1<< endl;
mid1=(right1+left1)/2;
mid2=(mid1+right1)/2;
ans1=f(mid1,Y);ans2=f(mid2,Y); //
if(ans2>=ans1){//答案在left1与mid2之间
right1=mid2;
}else{
left1=mid1;
}
}
printf("%.4f\n",f(left1,Y));
}
return 0;
}