三分
-
题意
题目链接:https://www.luogu.com.cn/problem/P3382
一个凸函数,找到这个函数的转折点。
-
思路
浮点三分,三分的思路就是,总体上来讲和二分是差不多的,就是一些小细节,比如三分需要在[l, r]中找到两个点,一个点靠近 l ,一个点靠近 r,我们设这两个点分别为 m1 和 m2,然后函数为 f(x),当 f(m1) <= f(m2) 时,我们需要缩小范围,因为转折点肯定是这个区间里值最大的, 所以可以把范围缩小为 [m1, r],因为转折点肯定不可能是 m1,并且肯定比 m1 要大,反之,亦然。
三分的讲解链接: https://blog.csdn.net/littlewhite520/article/details/70144763
-
代码
#include <bits/stdc++.h>
#include<iostream>
#include<algorithm>
#include<vector>
#include<cstring>
#define endl '\n'
//#define int long long
using namespace std;
typedef long long ll;
typedef pair<int, int> PII;
const int N = 2e5+10;
int n;
double l, r;
double a[20];
double geta(double idx){
double t = 0, res = 1.0;
for (int i = 0; i <= n; i ++){
t += a[i] * res;
res *= idx;
}
return t;
}
void sovle(){
cin >> n >> l >> r;
for (int i = n; i >= 0; i --){
cin >> a[i];
}
double m1, m2;
while (r - l >= 1e-7){
m1 = l + (r - l) / 3;
m2 = r - (r - l) / 3;
if (geta(m1) <= geta(m2)) l = m1;
else r = m2;
}
printf("%.5lf\n", (m1 + m2) / 2.0);
}
int main()
{
int t = 1;
//scanf("%d", &t);
while (t --){
sovle();
}
return 0;
}