题目如下:https://www.luogu.com.cn/problem/P3382
思路:
先增后减求极大。
如果s(mid)大于s(mmid),那么答案在[l,mmid]之间
否则答案在[mid,r]之间
#include<bits/stdc++.h>
using namespace std;
double e=1e-10;
int n;
double l,r,a[14];
double solve(double x){//代入
double ans=1,sum=0;
for(int i=n+1;i>=1;i--){
sum+=ans*a[i];
ans*=x;
}
return sum;
}
int main(){
scanf("%d%lf%lf",&n,&l,&r);
for(int i=1;i<=n+1;i++){
scanf("%lf",&a[i]);
}
while(r-l>=e){//三分
double mid=l+(r-l)/3;//第1个点
double mmid=r-(r-l)/3;//第2个点
if(solve(mid)-solve(mmid)>=e){//第1个点距离答案更近
r=mmid;//答案在[l,mmid]之间
}
else{//否则
l=mid;//答案在[mid,r]之间
}
}
printf("%.5lf\n",l);
return 0;
}
浙公网安备 33010602011771号