88888888y

导航

 

题目如下: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;
}
posted on 2022-02-22 11:14  88888888y  阅读(27)  评论(0)    收藏  举报