三分法模板

【模板】三分法

题目描述

如题,给出一个N次函数,保证在范围[l,r]内存在一点x,使得[l,x]上单调增,[x,r]上单调减。试求出x的值。

输入输出格式输入格式:

第一行一次包含一个正整数N和两个实数l、r,含义如题目描述所示。

第二行包含N+1个实数,从高到低依次表示该N次函数各项的系数。

输出格式:

输出为一行,包含一个实数,即为x的值。四舍五入保留5位小数。

输入输出样例

输入样例#1:

3 -0.9981 0.5
1 -3 -3 1

输出样例#1:

-0.41421

话说要注意的地方大概就是最好控制次数,不然容易精度流失

画了一个简陋的图

 1 #include<iostream>
 2 #include<cstring>
 3 #include<cstdio>
 4 #include<algorithm>
 5 using namespace std;
 6 double a[20],l,r;
 7 int n;
 8 void inti()
 9 {
10     scanf("%d%lf%lf",&n,&l,&r);
11     for(int i=n;i>=0;i--)
12     scanf("%lf",&a[i]);
13 }
14 double f(double x)
15 {
16     double tmp=1,sum=a[0];
17     for(int i=1;i<=n;i++)
18     {
19         tmp=tmp*x;
20         sum+=tmp*a[i];
21     }
22     return sum;
23 }
24 void work()
25 {
26     double mid1,mid2;
27     for(int i=1;i<=200;i++)
28     {
29         mid1=l+(r-l)/3;
30         mid2=l+(r-l)/3*2;
31         if(f(mid1)>f(mid2)) r=mid2;
32         else l=mid1;
33     }
34     printf("%.5lf",l);
35
36 }
37 int main()
38 {
39     inti();
40     work();
41     return 0;
42 }

以上By Native_carrot

时间: 2024-10-27 13:19:09

三分法模板的相关文章

P3382 【模板】三分法

题目描述 如题,给出一个N次函数,保证在范围[l,r]内存在一点x,使得[l,x]上单调增,[x,r]上单调减.试求出x的值. 输入输出格式 输入格式: 第一行一次包含一个正整数N和两个实数l.r,含义如题目描述所示. 第二行包含N+1个实数,从高到低依次表示该N次函数各项的系数. 输出格式: 输出为一行,包含一个实数,即为x的值.四舍五入保留5位小数. 输入输出样例 输入样例#1: 3 -0.9981 0.5 1 -3 -3 1 输出样例#1: -0.41421 说明 时空限制:50ms,12

【模板】三分法

题目描述 如题,给出一个N次函数,保证在范围[l,r]内存在一点x,使得[l,x]上单调增,[x,r]上单调减.试求出x的值. 输入输出格式 输入格式: 第一行一次包含一个正整数N和两个实数l.r,含义如题目描述所示. 第二行包含N+1个实数,从高到低依次表示该N次函数各项的系数. 输出格式: 输出为一行,包含一个实数,即为x的值.四舍五入保留5位小数. #include <cstdio> #include <cstring> #include <iostream> #

luogu3382【模板】三分法

给出一个N次函数,保证在范围[l,r]内存在一点x,使得[l,x]上单调增,[x,r]上单调减.试求出x的值. 看代码即可. #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int MAX_N = 15; const double EPS = 0.0000001; double A[MAX_N]; int N; double F(double x)

【算法学习】三分法

我们都知道二分查找以及许多二分的应用. 但是二分主要是对于有单调性的函数或数列才能使用. 如果这个函数/数列没有单调性,而是有一种单峰/谷的特性. 我们可以使用三分法来确定这个函数的极值. 三分法的具体思想可在别处见到. 我就贴一个自己的模板,没有bug-- 因为我曾经被一个有bug的模板坑害了-- 速度非常快,常数应该很小.约是二分的两倍常数左右. 1 l=L,r=R;//确定l,r的初值,保证l<=r哦 2 while(l!=r){ 3 if(r-l<3){//[l,r]超过3就特判 4

小谈二分法 三分法

二分法,三分法主要是空间图形的不同,二分法主要解决的是在某个区间之间单调增或减的图形,而三分法主要解决的是凸形,或者凹形的图形,这样的用三分法比较方便些. 二分法模板, 整数类型的有以下大致模板: <span style="font-size:14px;">int low=0,high=n,mid,x,res=-1; while(low<high) { mid=(high+low)/2; if(num[mid]==x)//其中x是我们想要寻找的元素,num数组单调递增

[LuoguP1883]函数 三分法

三分法的模板,一直提交,一直WA 结果,今天把精度判断从l-r>=t改成 fabs(F(l)-F(r))>=t ,过了三个点,再将 \(t\) 改成 \(10^{-7}\) 就 \(AC\) 了... 这给我一个十分重要的启示:精度问题十分重要!!! #include <iostream> #include <cstdio> #include <cmath> using namespace std; const int MAXN = 10000+5; int

【模板】三分查找

三分查找和二分查找差不多,就是把一段区间平均分成三段而不是两段. 三分查找适用于凸函数,即有一个顶点,顶点两边单调的函数(比如二次函数). 对于一段l~r的区间,把它分成l~L,L~R,R~r三段. 以顶点为最大值的情况为例, 若f(L)<f(R),则最高点在L~R或R~r中. 若f(L)>f(R),则最高点在l~L或L~R中, while(r-l>=1e-6) { double k = (r-l)/3.0; double L = l+k; double R = r-k; if(f(L)

算法竞赛专题解析(1):二分法、三分法

目录 1. 二分法的理论背景 2. 整数二分模板 2.1 基本形式 2.2 STL的lower_bound()和upper_bound() 2.3 简单例题 3. 整数二分典型题目 3.1 最大值最小化(最大值尽量小 3.1.1序列划分问题 3.1.2 通往奥格瑞玛的道路 3.2 最小值最大化(最小值尽量大) 4. 实数二分 4.1 基本形式 4.2 实数二分例题 5. 二分法习题 6. 三分法求极值 6.1 原理 6.2 实数三分 6.2.1 实数三分习题 6.3 整数三分 本系列是这本算法教

三分法求最值简介

算法介绍 算法简介:三分法适用于以O($logn$)复杂度求解单峰函数的最值,平均每次舍去$1/3$的定义域. 适用条件: 有界性:有明确的初始定义域. 单峰性:仅存在一个目标最值,且最值两侧的函数单调. (注:二分法用于求解单调函数零点,三分法用于求解单峰函数最值,二者思想相似,但适用条件有本质区别) 实现细节: 确定初始区间$l,r$. 找到三等分点$m1,m2$,求出函数在这两点的函数值$f1,f2$. 比较$f1,f2$,将其中与最值方向相反的三等分点,所在的$1/3$定义域舍去.(详解