分析:求F(x)=max(Si(x));
画图分析易知F(x)一定是一个下凸的图像,三分
这个题的精度要注意,还不会精度到底要怎么搞,我一般都取1e-7,这次wa了,取了1e-10过了。
#include <bits/stdc++.h>
using namespace std;
//把F[x]=max(s(x))表示出来;
int n;
struct node{double a,b,c;}p[10010];
double S(double a,double b,double c,double x){return a*x*x+b*x+c;}
double F(double x){
double m=S(p[1].a,p[1].b,p[1].c,x);
for(int i=2;i<=n;i++){
m=max(m, S(p[i].a,p[i].b,p[i].c,x) );
}
return m;
}
double Trfi(double l,double r){
double ll=(l*2+r)/3,rr=(r*2+l)/3;
while(rr-ll>1e-10){
if( F(ll)>F(rr) ) l=ll;
else r=rr;
ll=(l*2+r)/3,rr=(r*2+l)/3;
}
return F((rr+ll)/2);
}
int main(){
int t;scanf("%d",&t);
while(t--){
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%lf%lf%lf",&p[i].a,&p[i].b,&p[i].c);
}
printf("%.4f\n",Trfi(0.0,1000.0));
}
return 0;
}
这个题又学到了一个“代码技巧”:就是多个函数取最大值(最小值)的操作