前言

今天考试出了一个题

郭郭模拟退火骗了75分

于是再次把咕咕了好久的模退提上日程

如果进展顺利

明后天应该会开爬山算法和模退的博客笔记

今天先把今天考试的正解学习一下——三分法

引入

老规矩上板子题

LuoguP3382

题目描述

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

输入格式

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

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

输出格式

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

Input

3 -0.9981 0.5
1 -3 -3 1

Output

-0.41421

秦九韶算法

背景(废话)

秦九韶算法是一种将一元n次多项式的求值问题转化为n个一次式的算法。

其大大简化了计算过程,即使在现代,利用计算机解决多项式的求值问题时,秦九韶算法依然是最优的算法。

在西方被称作霍纳算法,是以英国数学家霍纳命名的。

计算方法

求多项式的值:

\[f(x) = a_0 + a_1x + a_2x^2+a_3x^3+\cdots+a_nx^n
\]

一眼暴力直接求值

那还要秦九韶干啥

本质就是提公因式

\[f(x)=a_0+x(a_1+a_2x+a_3x^2+\cdots+a_nx^{n -1})
\]

\[f(x)=a_0+x(a_1+x(a_2+a_3x+\cdots+a_nx^{n -2})
\]

顺序进行到最后

\[f(x)=(\cdots(a_nx+a_{n-1})x+a_{n-2})x+\cdots+a_1)x+a_0
\]

来看一个五次式

\[f(x)=x^5+x^4+x^3+x^2+x+1\quad (x=5)
\]

暴力求需要10个乘法

利用秦九韶算法显然可以只成4次

这下就大大改善了效率

显然的,次数越高

算法效率优化越明显


接下来进入正题:三分法

三分法

简介

三分法一般用来求某一个单峰函数的最值。

没了。。。

和二分的区别就是

二分要求区间单调

三分要求只有一个“单峰”,即最值

实现

给定上下界,每次将上下界这个区间平均分成三份,取两个三等分点比较,并缩小范围。

三分法就是单峰函数求最值

当前我们位于\([l,r]\)

然后我们我们有两个三等分点\(mid,mmid(mid<mmid)\)

也不一定非要两个三等分点,只是举个例子

假设我们求最大值

我们比较\(f(mid)\)以及\(f(mmid)\)

1.\(f(mid)>f(mmid)\)

那么可以确定的是\(mmid\)一定位于最值右边

2.\(f(mid)<f(mmid)\)

那么可以确定的是\(mid\)一定位于最值左边

Code

#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <queue>
#include <cmath>
using namespace std; inline int read(){
int x = 0, w = 1;
char ch;
for(; ch > '9' || ch < '0'; ch = getchar()) if(ch == '-') w = -1;
for(; ch >= '0' && ch <= '9'; ch = getchar()) x = x * 10 + ch - '0';
return x * w;
} const double eps = 1e-8;
double a[20];
int n; inline double f(double x){
double ans = 0.0;
for(int i = n; i >= 0; i--)
ans = ans * x + a[i];
return ans;
} double l, r;
signed main(){
n = read();
cin >> l >> r;
for(int i = n; i >= 0; i--)
cin >> a[i];
while(fabs(l - r) >= eps){
double midl = l + (r - l) / 3;
double midr = r - (r - l) / 3;
if(f(midl) > f(midr))
r = midr;
else l = midl;
}
printf("%.5lf\n", l);
return 0;
}

小结

这么来看三分还是很简单的(doge

这个板子求导+二分好像也能做

但是咱们今天学习板子对吧

稍等做完T4会把题目放到下面

秦九韶算法 & 三分法的更多相关文章

  1. 学习笔记--三分法&秦九韶算法

    前言 其实也没什么好说的吧,三分法就是用来求一个单调函数的最值和满足最大值的\(x\),秦九韶算法就是在\(O(N)\)时间内求一个多项式值 怎么用 三分法使用--看这篇:https://www.cn ...

  2. bzoj3157国王奇遇记(秦九韶算法+矩乘)&&bzoj233AC达成

    bz第233题,用一种233333333的做法过掉了(为啥我YY出一个算法来就是全网最慢的啊...) 题意:求sigma{(i^m)*(m^i),1<=i<=n},n<=10^9,m ...

  3. hdu.1111.Secret Code(dfs + 秦九韶算法)

    Secret Code Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Tota ...

  4. 算法 《秦九韶算法java实践》

    [历史背景] 秦九韶算法是中国南宋时期的数学家秦九韶表述求解一元高次多项式的值的算法--正负开方术.它也能够配合牛顿法用来求解一元高次多项式的根.在西方被称作霍纳算法(Horner algorithm ...

  5. 解方程(hash,秦九韶算法)

    题目描述 已知多项式方程: a0+a1x+a2x2+⋯+anxn=0 求这个方程在 [1,m]内的整数解(n 和 m 均为正整数). 输入输出格式 输入格式: 共 n+2 行. 第一行包含 2个整数 ...

  6. 数学【p1412】 经营与开发(秦九韶算法)

    顾z 你没有发现两个字里的blog都不一样嘛 qwq 题目描述-->P1412 经营与开发 分析 虽然看到\(Rank_1\)已经有了解释. 但我认为我能BB的更好 我还是决定来写一篇题解. q ...

  7. NOIp 2014 解方程 【数学/秦九韶算法/大数取膜】By cellur925

    题目传送门 题意:求高次方程的解及其个数.其中 1° 我们知道,高次方程是没有求根公式的.但是利用逆向思维,我们可以进行“试根法”,因为题目中给出了所求根的范围.但是多项式系数过于吓人,达到了sxbk ...

  8. 【秦九韶算法】【字符串哈希】bzoj3751 [NOIP2014]解方程

    在模意义下枚举m进行验证,多设置几个模数,而且小一些,利用f(x+p)%p=f(x)%p降低计算次数.UOJ AC,bzoj OLE. #include<cstdio> #include& ...

  9. 算法 《霍纳的方法java实践》

    [历史背景] 霍纳的方法是中国南宋时期的数学家秦九韶表述求解一元高次多项式的值的算法--正负开方术. 它也能够配合牛顿法用来求解一元高次多项式的根.在西方被称作霍纳算法(Horner algorith ...

随机推荐

  1. java IO流 (三) 节点流(或文件流)

    1.FileReader/FileWriter的使用:1.1 FileReader的使用 /* 将day09下的hello.txt文件内容读入程序中,并输出到控制台 说明点: 1. read()的理解 ...

  2. 爬虫前篇 /https协议原理剖析

    爬虫前篇 /https协议原理剖析 目录 爬虫前篇 /https协议原理剖析 1. http协议是不安全的 2. 使用对称秘钥进行数据加密 3. 动态对称秘钥和非对称秘钥 4. CA证书的应用 5. ...

  3. 微信小程序wx.switchTab跳转到tab页面后onLoad里面的方法不执行

    相信大家在做小程序的时候启动页跳转到tab首页会用到switchTab 但是在跳转后发现页面模块不全,后面console.log()后发现是onLoad里面的方法不执行 解决这种问题的方法页有很多中, ...

  4. 【C#】WebService接受跨域请求及返回json数据

    问题概述 通过Web Service发布服务供客户端调用是一种非常简单.方便.快速的手段,并且服务发布后会有一个服务说明页面,直观明了,如图: 一般情况下,在web页面中的JavaScript中调用W ...

  5. Python3 迭代器深入解析

    第6章 函数 6.1 函数的定义和调用 6.2 参数传递 6.3 函数返回值 6.4 变量作用域 6.5 匿名函数(lambda) 6.6 递归函数 6.7 迭代器 6.8 生成器 6.9 装饰器 6 ...

  6. Java Properties集合基础解析

    Java Properties集合基础解析 本期学习的properties集合是项目中经常用到的操作 什么是Properties集合? java.util.Properties集合继承于Hashtab ...

  7. Python的telnetlib模块使用

    telnetlib模块的常用接口 telnetlib.Telnet(host, port, timeout) # 登录 write() # 输入命令 read_until(match) # 读出响应, ...

  8. 一起学Blazor WebAssembly 开发(3)

    接着上篇,本篇开始讲下实现登录窗口,先看下大概的效果图: 打开的效果,没有美工美化 点登录校验得到不能为空 我在做blazor时用到了一个ui框架,这个框架名叫Ant Design blazor(ht ...

  9. 字符串学习总结(Hash & Manacher & KMP)

    前言 终于开始学习新的东西了,总结一下字符串的一些知识. NO.1 字符串哈希(Hash) 定义 即将一个字符串转化成一个整数,并保证字符串不同,得到的哈希值不同,这样就可以用来判断一个该字串是否重复 ...

  10. Java 中的链式编程

    前言 ​ 在写项目的时候,有一个实体类有好多个属性,new 出来之后需要不停的使用setXXX( )方法,效率低而且代码可读性差,查询了下发现可以实现实体类的链式编程. public class Us ...