大意:
给你n个二次函数Si(x),F(x) = max{Si(x)}
求F(x)在[0,1000]上的最小值。
S(x)=ax^2+bx+c
(0<=a<=100, |b|,|c|<=5000)
简单分析一下可知函数F(x)的图形是下凸函数,可以采用三分法求最值。
CODE:
#include <cstdio>
#include <algorithm>
using namespace std; const int maxn = 10000 + 10;
int n, a[maxn], b[maxn], c[maxn]; double F(double x)
{
double ans = a[0]*x*x + b[0]*x + c[0];
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;
scanf("%d", &T);
while(T--)
{
scanf("%d", &n);
for(int i=0; i < n; ++i) scanf("%d%d%d", &a[i], &b[i], &c[i]);
double L = 0.0, R = 1000.0;
for(int i = 0; i < 100; ++i)
{
double m1 = L + (R - L)/3;
double m2 = R - (R - L)/3;
if(F(m1) < F(m2) ) R = m2;
else L = m1;
}
printf("%.4lf\n", F(L));
}
return 0;
}
求单峰函数的极值也可以用黄金分割法