P1883 函数 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
Error Curves - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
这两题是一模一样的,过一题水两题。
分析
主要难点在于证明F(x)是一个单峰函数可以被三分,但是我随便画了几个f(x)之后发现好像就是可以被三分,而且a也大于0,那就直接开做了。
坑
题目要求答案精度是精确到1e-4,还要求四舍五入那就是要求答案精确到1e-5。
但是我们三分的时候一直在缩小的是x的取值,x进入f(x)之后才是答案的值。
如果有这么一个二次函数他峰值变化及其缓慢,而x的值变的较快,那三分x的值就必须比答案更加精确。
具体的值不知道怎么算(函数太难了),但是留个心眼,给三分的值开到两倍多的精度也许就够了。
AC代码
#include <bits/stdc++.h>
//#define int long long
#define fr first
#define se second
#define endl '\n'
using namespace std;
const int N=1e4+5;
int n;
double a[N],b[N],c[N],l,r,mid,eps=1e-10;
double cul(double x){
double MAX=a[1]*x*x+b[1]*x+c[1];
for(int i=2;i<=n;++i)
MAX=max(MAX,a[i]*x*x+b[i]*x+c[i]);
return MAX;
}
void solve(){
cin>>n;
for(int i=1;i<=n;++i)
cin>>a[i]>>b[i]>>c[i];
while(r-l>eps){
mid=(l+r)/2;
if(cul(mid)>cul(mid+eps))l=mid;
else r=mid;
}
cout<<fixed<<setprecision(4)<<cul(l)<<endl;
}
void init(){
l=0,r=1000;
}
signed main(){
ios::sync_with_stdio(false),cin.tie(nullptr);
int t;
cin>>t;
while(t--)init(),solve();
return 0;
}