http://acm.hdu.edu.cn/showproblem.php?pid=3714
本题用三分搜索法,应该也算简单的三分应用了,正好借这题学了一下三分
这里总结一下三分
先找到左边界left和右边界right
然后取mid=(left+right)/2.0,midmid=(mid+right)/2.0;
然后比较mid,midmid然后根据你的图像赋值left或者right
代码:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <queue>
#include <map>
using namespace std;
struct node
{
double a,b,c;
}f[10005];
int n;
double max(double a,double b)
{
if(a>b)
return a;
else
return b;
}
double cal(double x,double a,double b,double c)
{
return a*x*x+b*x+c;
}
double maxmap(double x)
{
double maxn=-1e10;
for(int i=0;i<n;i++)
maxn=max(maxn,cal(x,f[i].a,f[i].b,f[i].c));
return maxn;
}
double three()
{
double left=0;
double right=1000.0;
for(int i=0;i<=100;i++)
{
double mid=(left+right)/2.0;
double midmid=(mid+right)/2.0;
double mleft=maxmap(mid);
double mright=maxmap(midmid);
if(mleft<mright)
right=midmid;
else
left=mid;
}
double ans=maxmap(left);
return ans;
}
int main( )
{
int T;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
for(int i=0;i<n;i++)
scanf("%lf%lf%lf",&f[i].a,&f[i].b,&f[i].c);
printf("%.4f\n",three());
}
}