前往:我自己搭建的博客
题目
题解
三分法用于求单峰或单谷函数的极值,并且函数极值的两边必须严格单调。流程:类比二分,设l,r,lmid,rmid指针,其中lmid,rmid是[l,r]的三等分点。此处以单峰函数为例,若f[lmid]<f[rmid],则lmid,rmid同在极值左侧或在极值两侧,则极值在lmid右侧;若f[lmid]>f[rmid],同理,极值在rmid左侧;若f[lmid]=f[rmid],则两指针分在极值两侧。
代码
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const double eps=1e-7; //eps一般设为1e-(精确位数+2)
int n;
double l,r,lmid,rmid;
double num[20];
inline double val(double x) //求f[x]
{
double tmp=1,ans=0; //tmp=x^i
for(int i=0;i<=n;i++)
{
ans+=tmp*num[i];
tmp*=x;
}
return ans;
}
inline void sanfen()
{
while(r-l>eps)
{
lmid=l+(r-l)/3;
rmid=r-(r-l)/3;
if(val(lmid)<val(rmid)) l=lmid;
else r=rmid;
}
}
int main()
{
scanf("%d%lf%lf",&n,&l,&r);
for(int i=n;i>=0;i--) scanf("%lf",&num[i]);
sanfen();
printf("%.5f\n",l);
return 0;
}