88888888y

导航

 

题目:http://ybt.ssoier.cn:8088/problem_show.php?pid=1435

思路:首先,找出一堆最大值

   其次,找出一堆最大值里的一个最小值

   最后,把那个最小值扔进函数

#include<bits/stdc++.h>
using namespace std;
int n;
double a[10001],b[10001],c[10001];
double q=1e-12;//精度越高越好
double s(double x){
	double maxx=-0x3f3f3f3f;//既然要找最大值,那就定得越小越好
	for(int i=1;i<=n;++i){
		maxx=max(maxx,a[i]*x*x+b[i]*x+c[i]);//代入二次函数
        //先求的是最大值,所以要用max而不是min
	}
	return maxx;
}
int main(){
	int t;//以下全是正常操作
	scanf("%d",&t);
	while(t--){
		scanf("%d",&n);
		for(int i=1;i<=n;++i){
			scanf("%lf%lf%lf",&a[i],&b[i],&c[i]);
		}//以上全是正常操作
		double l=0,r=1000;//区间由0到1000
		while(r-l>=q){
			double lmid=l+(r-l)/3.0;//三分点
			double rmid=r-(r-l)/3.0;//三分点
            //以下宗旨:向着小的靠拢
			if(s(lmid)<=s(rmid)){
				r=rmid;
			}
			else{
				l=lmid;
			}
		}
		printf("%.4lf\n",s(l));//要的不是x,而是s(x)
	}
	return 0;
}

 

 

posted on 2022-02-25 11:10  88888888y  阅读(31)  评论(0)    收藏  举报