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;
}