原题
三分法,记个模板。
以单峰函数f为例,我们要求极大值点 x ,可以在定义域 [l,r] 上取两个三等分点 lmid , rmid ,把函数分为三段。
- f(lmid) < f(rmid),可令 l = lmid
- f(lmid) > f(rmid),可令 r = rmid
- f(lmid) = f(rmid), l = lmid 或 r = rmid 均可
AC代码
#include<bits/stdc++.h>
using namespace std;
const double eps=1e-6;
double a[20];
double fac(double x,int r)
{
double ans=1;
for(int i=1;i<=r;i++)
ans*=x;
return ans;
}
double check(double x,int n)
{
int i=1;
double ans=0;
for(int i=1;i<=n+1;i++)
ans+=a[i]*fac(x,n-i+1);
return ans;
}
int main()
{
int n;
double l,r;
cin>>n>>l>>r;
for(int i=1;i<=n+1;i++)
cin>>a[i];
while(r-l>eps)
{
double lmid=l+(r-l)/3.0,rmid=r-(r-l)/3.0;
if(check(lmid,n)<=check(rmid,n))
l=lmid;
else
r=rmid;
}
printf("%.5lf",l);
return 0;
}
这个%f输出真是让人搞不懂,%lf就出来一堆奇怪的东西