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)
{
	double ans = A[1];
	for(int i = 2; i <= N; i++)
		ans = ans * x + A[i];
	return ans;
}

int main()
{
	double l, r;
	scanf("%d%lf%lf", &N, &l, &r);
	N++;
	for(int i = 1; i <= N; i++)
		scanf("%lf", A + i);
	while(r - l > EPS)
	{
		double mid1 = (r - l) / 3 + l, mid2 = (r - l) / 3 * 2 + l;
		if (F(mid1) > F(mid2))
			r = mid2;
		else
			l = mid1;
	}
	printf("%.5f\n", l);
	return 0;
}

  

原文地址:https://www.cnblogs.com/headboy2002/p/9218907.html

时间: 2024-10-11 10:43:40

luogu3382【模板】三分法的相关文章

算法竞赛专题解析(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 整数三分 本系列是这本算法教

三分法模板

[模板]三分法 题目描述 如题,给出一个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 话说要注意的地方

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> #

【算法学习】三分法

我们都知道二分查找以及许多二分的应用. 但是二分主要是对于有单调性的函数或数列才能使用. 如果这个函数/数列没有单调性,而是有一种单峰/谷的特性. 我们可以使用三分法来确定这个函数的极值. 三分法的具体思想可在别处见到. 我就贴一个自己的模板,没有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)

三分法求最值简介

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