笑死,莫名其妙在最后学个新算法,不过不太难的样子。
即对于一个有极值的函数,求取极值。与二分的差别在于,它处理的是单峰函数,而二分处理的是单调函数。
突然想到为什么二分是单调呢,自己思考。
P3382 【模板】三分
不难想到,对于一个单峰函数,我们可以任取起两个点,然后判断这两个哪个更靠近顶点,舍弃另一个即可。提一嘴小数二分,lr之间允许差值,我建议是用ans保存,可能会好一点!
#include<bits/stdc++.h>
using namespace std;
int n,m;double a[100];
const double k=1e-6;
double getsum(double x)
{
double rt=0;for(int i=n;i>=0;i--) rt=rt*x+a[i];
return rt;
}
int main()
{
double l,r;scanf("%d%lf%lf",&n,&l,&r);for(int i=n;i>=0;i--) scanf("%lf",&a[i]);
double ans;while(l+k<=r)
{
double L=(r-l)/3.0,mid1=l+L,mid2=r-L;
if(getsum(mid1)>getsum(mid2)) ans=mid1,r=mid2;
else ans=mid2,l=mid1;
}printf("%.5lf",ans);
return 0;
}