洛谷P1883 函數

傳送門
水題使我快落

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <queue>
#include <map>
#include <cstring>
#include <cmath> 
using namespace std;
const int N=10050;
int T;
int n;
double a[N],b[N],c[N];
inline int read(){//好看的快讀 
	int x=0,f=1;
	char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
	while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
	return x*f;
}
double cal(double x){
	double maxx=-2147483647;
	for(int i=1;i<=n;i++)maxx=max(maxx,a[i]*x*x+b[i]*x+c[i]);
	return maxx;
}
int main(){
	T=read();
	while(T--){
		double minn=2147483647;
		n=read();
		for(int i=1;i<=n;i++) scanf("%lf%lf%lf",&a[i],&b[i],&c[i]);
		double l=0.0000;
		double r=1000.0000;
		while(l+1e-11<r){//這裏是在判斷double類型大小時候常用的一種方法,加上一個極小值,可以減小誤差,注意這個值的大小,要足夠小,我一開始取1e-6全Wa了嚶嚶嚶 
		    double mid=(l*2+r)/3;
			double midr=(l+r*2)/3;
			double f2=cal(mid);
			double f3=cal(midr);
			if(f2>f3)l=mid;
			else r=midr;
		}
		printf("%.4lf\n",cal(l));
	}
	return 0;

}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章