大体题意:
给你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;
}