题意:求一些开口向上的凹函数的最大值的最小值(不懂就仔细读两遍)
分析:一些开口向上的凹函数的最大值的最小值仍然是凹函数
求凹凸函数的最值明显用三分。详见代码,类似二分,只不过三分在中间取两个点,函数那不懂,多画图自己就能写出来。
#include<stdio.h>
#include<math.h>
#include<algorithm>
using namespace std;
int n,a[10002],b[10002],c[10002];
double m1,m2,l,r,ans;
double solve(double x)
{
int i=0;
double cont=a[0]*x*x+b[0]*x+c[0];
for(i=1;i<n;i++)
cont=max(cont,a[i]*x*x+b[i]*x+c[i]);
return cont;
}
int main()
{
int t,i;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%d%d%d",&a[i],&b[i],&c[i]);
}
l=0.0;r=1000.0;
for(i=0;i<100;i++)
{
m1=(l+r)/2.0;
m2=(m1+l)/2.0;
if(solve(m1)>solve(m2))
{
r=m1;
}
else l=m2;
}
ans=(l+r)/2.0;
printf("%.4lf\n",solve(ans));
}
return 0;
}