链接
http://acm.hdu.edu.cn/showproblem.php?pid=3714
题解
所有的函数取最大值得到一个先减后增的函数
直接三分即可
下面说明为什么是先减后增:
我把每条抛物线拆成左右两半,左半段肯定是递减的,右半段肯定是递增的
所有的左半段取max,所有的右半段取max
我肯定得到一个定义在
[
−
∞
,
x
1
]
[-\infty,x_1]
[−∞,x1]上的减函数和定义在
[
x
2
,
+
∞
]
[x_2,+\infty]
[x2,+∞]上的增函数
然后再把这两段取
m
a
x
max
max,即可得到最终曲线,而且肯定是先减后增的
代码
#include <bits/stdc++.h>
#define eps 1e-8
using namespace std;
#define maxn 10010
int N;
double a[maxn], b[maxn], c[maxn];
double f(double x)
{
double ans=-1e100;
for(int i=1;i<=N;i++)ans=max(ans,a[i]*x*x+b[i]*x+c[i]);
return ans;
}
int main()
{
int T, i;
double l, r, mid1, mid2;
scanf("%d",&T);
while(T--)
{
scanf("%d",&N);
for(i=1;i<=N;i++)scanf("%lf%lf%lf",a+i,b+i,c+i);
l=0, r=1000, mid1=l+(r-l)/3, mid2=mid1+(r-l)/3;
for(i=1;i<=100;i++)
{
if(f(mid1)>f(mid2))l=mid1;
else r=mid2;
mid1=l+(r-l)/3, mid2=mid1+(r-l)/3;
}
printf("%.4lf\n",f(mid1));
}
return 0;
}