昨天編程之美的C題搞不出來..看了下別人的方法...三分搜尋水之...以前沒寫過...
三分從二分上發展來的...當這個函數不是單峰時,也能找到最值~~好牛逼....
每次不僅取中點mid=(l+r)/2..還取令一個次中點mmid=(mid+r)/2...如果mid上的值比mmid優...r=mmid...否則 l=mid...
這題和昨天的C題可以說一模一樣...出原題不太好吧....
Program:
#include<iostream>#include<cmath>#include<stack>#include<queue>#include<set>#include<algorithm>#include<stdio.h>#include<string.h>#define ll long long#define oo 1000000007using namespace std; struct node{ double a,b,c;}f[10005];int n;double getdata(double x){ double m=f[1].a*x*x+f[1].b*x+f[1].c; for (int i=2;i<=n;i++) m=max(m,f[i].a*x*x+f[i].b*x+f[i].c); return m;}int main(){ int T,i; double l,r,ml,mr,dl,dr; scanf("%d",&T); while (T--) { scanf("%d",&n); for (i=1;i<=n;i++) scanf("%lf%lf%lf",&f[i].a,&f[i].b,&f[i].c); l=0.0; r=1000.0; while (r-l>1e-10) { ml=(l+r)/2; mr=(ml+r)/2; dl=getdata(ml); dr=getdata(mr); if (dl>dr) l=ml; else r=mr; } printf("%.4lf\n",getdata(r)); } return 0;}