大体题意:

给你n 个开口向上的抛物线,给你一个新的函数F(x),他的值是n 个抛物线的最大值,求Fx在[0,1000]的最小值?

思路:

三分法:

画一个抛物线可以知道,他是一个下凸函数,也有可能是一条直线,直线也可以看成是一个下凸函数!

画两个抛物线,无论这两个抛物线位置如何,还是一个下凸函数!

画多了就知道,无论怎么画抛物线,n个抛物线组成的fx 还是一个下凸函数!

因此存在唯一最小值!

我们可以用三分来求解!

单调用二分,凹凸用三分!

直接规定个迭代上限即可!

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn = 10000 + 10;
double a[maxn],b[maxn],c[maxn];
int n;
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("%lf %lf %lf",&a[i], &b[i], &c[i]);
		}
		double l = 0,r = 1000;
		for (int i = 0; i < 100; ++i){
			double m1 = (l+r)/2;
			double m2 = (m1+r)/2;
			if (f(m1) < f(m2)){
				r = m2;
			}
			else l = m1;
		}
		double ans = (l+r)/2;
		printf("%.4lf\n",f(ans));	
	}
	return 0;
}