三分模板(黄金分割求最值)
三分模板(黄金分割求最值)
时间复杂度:\(O(Tn)\)
#include<bits/stdc++.h>
using namespace std;
const double gold=(sqrt(5)-1)/2;//黄金分割
const double eps=1e-9;//一般题目要求精度+2(本题不是)
int T,n,a[10005],b[10005],c[10005];
double l,r;
double F(double x){//求多项式和
double mx=-INT_MAX;//初始化极小值
for(int i=1;i<=n;i++){
mx=max(mx,a[i]*x*x+b[i]*x+c[i]);
}
return mx;
}
int main(){
ios::sync_with_stdio(0);cin.tie(0);
cin>>T;
while(T--){
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i]>>b[i]>>c[i];
}
l=0,r=1000;
while(r-l>eps){
double Gold=(r-l)*gold; //区间黄金分割点
double rmid=l+Gold,lmid=r-Gold;
if(F(lmid)<F(rmid)) r=rmid;
else l=lmid;
}
cout<<fixed<<setprecision(4)<<F(l)<<'\n';
}
return 0;
}

浙公网安备 33010602011771号