题目分析:
- 本题是求最小值,三分时,令 lmid=l+(r−l)/3,rmid=r−(r−l)/3,如果f(rmid)>=f(lmid),就舍弃lmid右边那一截,令r=rmid
- 精度要开小点
Code:
#include <bits/stdc++.h>
using namespace std;
#define eps 1e-9
#define maxn 100010
int T,n;
double a[maxn],b[maxn],c[maxn];
inline double AKNOI_(double x) {
double maxd=-2139062143;
for(int i=1;i<=n;++i) {
maxd=max(maxd,a[i]*x*x+b[i]*x+c[i]);
}
return maxd;
}
void readda_() {
scanf("%d",&T);
for(int AKIOI=1;AKIOI<=T;++AKIOI) {
scanf("%d",&n);
for(int i=1;i<=n;++i) {
scanf("%lf%lf%lf",&a[i],&b[i],&c[i]);
}
double ans,l=0,r=1000,mid,l_mid,r_mid;
while(r-l>eps) {
mid=(r-l)/3;
l_mid=l+mid;
r_mid=r-mid;
if(AKNOI_(l_mid)<AKNOI_(r_mid)) {
ans=l_mid;
r=r_mid;
}
else l=l_mid;
}
printf("%.4lf\n",AKNOI_(ans));
}
}
int main() {
freopen("a.txt","r",stdin);
readda_();
return 0;
}