大意:给 n 个 ,构造一个 ,问你 S(x) 在区间 [0,1000]上的最小值。
思路:三分。为什么能呢? 主要是因为这题的数据比较特殊。a>=0,是凸函数(国际定义),即使 a==0函数退化为一次函数。
最后依然是一凸函数。
如右图红色部分,最后的函数一定为一个凸函数或者是单调函数,故三分。
#include <bits/stdc++.h>
using namespace std;
const double inf = 1e-9;
const int maxn = 1e5+500;
double l,r,Lm,Rm;
double a[maxn],b[maxn],c[maxn];
int n,m;
double fid(double x){
double an = -inf;
for(int i=0;i<n;++i)
an = max(an,a[i]*x*x+b[i]*x+c[i]);
return an;
}
int main(){
int _;scanf("%d",&_);
while(_--){
scanf("%d",&n);
for(int i=0;i<n;++i)
scanf("%lf%lf%lf",&a[i],&b[i],&c[i]);
l=0.0;r=1000.0;
while(fabs(r-l)>inf){
//printf("%lf %lf\n",l,r);
Lm = l+(r-l)/3.0;Rm = r-(r-l)/3.0;
if(fid(Lm)>fid(Rm)) l = Lm;
else r = Rm;
}
printf("%.4lf\n",fid(r));
}
return 0;
}