P1883 函数 题解
SunsetSamsara · · 题解
我的思路是数学方法,可以通过二次函数的性质来解答。
先看数据范围,发现这些二次函数的首项系数
而系数
所以,存在数
于是,函数
那么我们取
若存在两个
那么
所以
即不存在两个
所以,
综上,可以使用三分法解决。
代码如下:
#include<stdio.h>
int A[10001],B[10001],C[10001];
int n;
double calcF(double d){
double ret=0,t;
for(int i=1;i<=n;++i){
t=(A[i]*d+B[i])*d+C[i];
if(ret<t)ret=t;
}
return ret;
}
int main(){
int T;
scanf("%d",&T);
while(T--){
scanf("%d",&n);
for(int i=1;i<=n;++i)
scanf("%d%d%d",A+i,B+i,C+i);
double l=0,r=1000,dis=(r-l)/3,lmid=l+dis,rmid=r-dis; //左端点,右端点,用三分点lmid与rmid分界
while(r-l>1e-9){
//把大的值赋值给l或r
if(calcF(lmid)>calcF(rmid))l=lmid;
else r=rmid;
dis=(r-l)/3;lmid=l+dis;rmid=(r-dis);
//再算一遍
}
printf("%.4lf\n",calcF(l));
}
}