三分
题目描述
如题,给出一个
N
N
N次函数,保证在范围
[
l
,
r
]
[
[l, r][
[l,r][ 内存在一点
x
x
x,使得
[
l
,
x
]
[l, x]
[l,x]上单调增,
[
x
,
r
]
[x, r]
[x,r] 上单调减。试求出
x
x
x 的值。
大意就是求单峰函数的最值
它先告诉了我们最值可能处在的范围区间
[
l
,
r
]
[l,r]
[l,r]
所以我们可以通过两个三等分点把整个区间分成三份
l
m
i
d
,
r
m
i
d
lmid ,rmid
lmid,rmid
有两种情况
1.
f
(
l
m
i
d
)
>
f
(
r
m
i
d
)
f(lmid)>f(rmid)
f(lmid)>f(rmid) 此时最值肯定在
r
m
i
d
rmid
rmid的左边,所以可以把r更新为rmid
2.
f
(
l
m
i
d
)
>
f
(
r
m
i
d
)
f(lmid)>f(rmid)
f(lmid)>f(rmid) 此时最值肯定在
l
m
i
d
lmid
lmid的右边,所以可以把l更新为lmid
#include<bits/stdc++.h>
#define eps 1e-6
#define db double
using namespace std;
int n;
double a[25];
double l,r;
db f(db x){
db S=0;
for(int i=n;i>=0;i--) S=S*x+a[i];
return S;
}
int main()
{
cin>>n>>l>>r;
for(int i=n;i>=0;i--)cin>>a[i];
while(r-l>=eps)
{
double k=(r-l)/3.0;
double lmid=l+k;
double rmid=r-k;
// cout<<lmid<<" "<<rmid<<endl;
if(f(lmid)>f(rmid))r=rmid;
else l=lmid;
}
printf("%.5f",l);
return 0;
}