一本通——曲线

原题链接一本通——曲线icon-default.png?t=N3I4https://loj.ac/p/10013

这是一个经典的三分问题

二分模板只适用于解决单调问题,如果用到凸性函数或者凹形函数求他们的最大值或者小值就要用三分模板来解决

题解

#include<bits/stdc++.h>
using namespace std;
const int N=100010;
double a[N],b[N],c[N];
int n;
double check(double k){
	double js=1e-9;
	for(int i=1;i<=n;i++){
		js=max(js,a[i]*k*k+b[i]*k+c[i]);
	}
	return  js;
	
}
int main(){
	int t;
	cin>>t;
	while(t--){
		cin>>n;
		for(int i=1;i<=n;i++){
			cin>>a[i]>>b[i]>>c[i];
			
		}
		double l=0,r=2000,eps=1e-10;
		while(r-l>eps){
			double mid=(l+r)/2;
			double midmid=(mid+r)/2;
			if(check(midmid)<check(mid)){
				l=mid;
			}
			else{
				r=midmid;
			}
		}
		double ans=check(l);
		printf("%.4lf\n",ans);
		
	}
	return 0;
	
}

posted @ 2023-05-08 19:53  du463  阅读(10)  评论(0编辑  收藏  举报  来源