不是WA6 8两个点是为什么啊
  • 板块P1883 函数
  • 楼主quzitsix
  • 当前回复1
  • 已保存回复1
  • 发布时间2024/4/3 08:17
  • 上次更新2024/4/3 15:33:27
查看原帖
不是WA6 8两个点是为什么啊
983191
quzitsix楼主2024/4/3 08:17
#include<bits/stdc++.h>
using namespace std;
//#define double long double
const int maxn=10000+10,inf=100000000;
int n,a[maxn],b[maxn],c[maxn],cnt=0;
double ans;
int k;
double h(double x,int i){
	return x*x*a[i]+x*b[i]+c[i];
}
double f(double x,int &r){
	double res=h(x,1);
	r=1;
	for(int i=2;i<=k;i++){
		double ff=h(x,i); 
		if(ff>res) res=ff,r=i;
	}
	return res;
}
int is(double x,int i){
	if(a[i]>0){
		double kk=-b[i]/2/a[i];
//		cout<<kk<<endl;
		if(x>=kk) return -1;
		return 1;
	}
	if(b[i]<=0) return 1;
	return -1;
}
void ef(double l,double r,int il,int ir){
//	if(vl>ans&&vr>ans)
//	cnt++;
	if(r-l<1e-9) return ;
	double mid=(l+r)/2;
	int im;
	double res=f(mid,im);
//	cout<<ir<<endl; 
	ans=min(res,ans);
//	cout<<is(mid,im)<<" "<<mid<<" "<<im<<endl; 
	if(is(mid,im)==1){
		ef(mid,r,im,ir);
	}
	else{
		ef(l,mid,il,im);
	}
}
int main(){
	cin>>n;
	while(n--){
		cin>>k;
		for(int i=1;i<=k;i++){
			cin>>a[i]>>b[i]>>c[i];
		}
		int il,ir;
		double x1=f(0,il),x2=f(1000,ir);
		ans=min(x1,x2);
		ef(0,1000,il,ir);
		printf("%.4f\n",ans);
		cnt=0;
	}
	return 0;
}
2024/4/3 08:17
加载中...