题目描述
题目:0d0bf6ba066461dbfdb5a85da17b8a99 (csgrandeur.cn)
题意:给定 n 个二次函数f(x),设F(x)=max{f1(x),f2(x),...,fn(x)},求 F(x) 在区间[0,1000] 上的最小值。
思路:
这道题先输入了一些二次函数,F(x)是每一个点上的最大值,二次函数开口向上,最后形成的F(x)函数图像类似于一个二次函数,所以用三分查找,可以找到F(x)最小的地方。
代码:
#include <iostream>
#include <cstring>
#include <cmath>
#include <cstdio>
#include <algorithm>
#include <vector>
using namespace std;
typedef long long ll;
typedef double db;
db a[10005];
db b[10005];
db c[10005];
int main() {
std::ios::sync_with_stdio(false);
int t;
cin>>t;
while(t--){
int n;
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i]>>b[i]>>c[i];
}
db l=0,r=1000,mid1,mid2,jud=1e-11,num1=0,num2=0,tmp;
while(r-l>jud){
mid1=l+(r-l)/3;
mid2=r-(r-l)/3;
num1=0,num2=0;
for(int i=1;i<=n;i++){
tmp=a[i]*mid1*mid1+b[i]*mid1+c[i];
num1=max(num1,tmp);
}
for(int i=1;i<=n;i++){
tmp=a[i]*mid2*mid2+b[i]*mid2+c[i];
num2=max(num2,tmp);
}
if(num1>num2){
l=mid1;
}else{
r=mid2;
}
}
printf("%.4f\n",num1);
}
}