洛谷三分法https://www.luogu.com.cn/problem/P3382
题目描述
如题,给出一个 N 次函数,保证在范围 [l,r] 内存在一点 x,使得 [l,x] 上单调增,[x,r] 上单调减。试求出 x 的值。
输入格式
第一行一次包含一个正整数 N 和两个实数 l,r,含义如题目描述所示。
第二行包含 N+1 个实数,从高到低依次表示该 N 次函数各项的系数。
输出格式
输出为一行,包含一个实数,即为 x 的值。若你的答案与标准答案的相对或绝对误差不超过 10−510−5 则算正确。
输入输出样例
输入 #1复制
3 -0.9981 0.5 1 -3 -3 1
输出 #1复制
-0.41421
说明/提示
对于 100%100% 的数据,6≤N≤13,函数系数均在 [−100,100][−100,100] 内且至多 1515 位小数,∣l∣,∣r∣≤10 且至多 1515 位小数。l≤r。
// Problem: P3382 【模板】三分法
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/P3382
// Memory Limit: 128 MB
// Time Limit: 1000 ms
//
// Powered by CP Editor (https://cpeditor.org)
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
typedef long long ll;
const int N = 200;
int n;
double l,r;
double a[15];
//三分法模板
double check(double x){ //秦九韶算法,形似an*(x^n)+an-1*(x^n-1)+an-2*(x^n-2)...
double sum=0;
for(int i=n;i>=0;i--){
sum=sum*x+a[i];
}
return sum;
}
void s(){
cin>>n>>l>>r;
for(int i=n;i>=0;i--){
cin>>a[i];
}
while(r-l>=1e-7){ //三分法
double mid=(l+r)/2;
if(check(mid+1e-7)>check(mid-1e-7)) l=mid;
else r=mid;
}
printf("%.5lf",l);
}
int main(){
int T=1;
//cin>>T;
while(T--){
s();
}
return 0;
}