https://loj.ac/problem/10013
题解:这道题运用的是新方法三分,然后稍微总结一下三分(就是说具有一定的单调性,找最大最小值,然后和二分基本类似,就是说特性就是说当前两个点比较,较优的点和最优点在相对了较差点的同侧,就是说那边差就把范围定到那里去)
错误:要注意精度问题,一般定到1e-9或1e-11;
代码
#include<iostream> #include<cstdio> #include<cstdlib> using namespace std; int t,n; double a[101000],b[101000],c[101000]; double f(double x){ double maxa=-1e9; for(int i=1;i<=n;i++) maxa=max(maxa,x*x*a[i]+x*b[i]+c[i]); return maxa; } int main(){ scanf("%d",&t); while(t--){ scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%lf%lf%lf",&a[i],&b[i],&c[i]); double l=0.0,r=1000.0,eps=1e-11;//wrong while(r-l>eps){ double midl=l+(r-l)/3.0,midr=r-(r-l)/3.0; if(f(midl)<f(midr))r=midr; else l=midl; } printf("%.4f ",f(l)); } return 0; }