秦九韶算法 & 三分法
前言
今天考试出了一个题
郭郭模拟退火骗了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个一次式的算法。
其大大简化了计算过程,即使在现代,利用计算机解决多项式的求值问题时,秦九韶算法依然是最优的算法。
在西方被称作霍纳算法,是以英国数学家霍纳命名的。
计算方法
求多项式的值:
\]
一眼暴力直接求值
那还要秦九韶干啥
本质就是提公因式
\]
\]
顺序进行到最后
\]
来看一个五次式
\]
暴力求需要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会把题目放到下面
秦九韶算法 & 三分法的更多相关文章
- 学习笔记--三分法&秦九韶算法
前言 其实也没什么好说的吧,三分法就是用来求一个单调函数的最值和满足最大值的\(x\),秦九韶算法就是在\(O(N)\)时间内求一个多项式值 怎么用 三分法使用--看这篇:https://www.cn ...
- bzoj3157国王奇遇记(秦九韶算法+矩乘)&&bzoj233AC达成
bz第233题,用一种233333333的做法过掉了(为啥我YY出一个算法来就是全网最慢的啊...) 题意:求sigma{(i^m)*(m^i),1<=i<=n},n<=10^9,m ...
- hdu.1111.Secret Code(dfs + 秦九韶算法)
Secret Code Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Tota ...
- 算法 《秦九韶算法java实践》
[历史背景] 秦九韶算法是中国南宋时期的数学家秦九韶表述求解一元高次多项式的值的算法--正负开方术.它也能够配合牛顿法用来求解一元高次多项式的根.在西方被称作霍纳算法(Horner algorithm ...
- 解方程(hash,秦九韶算法)
题目描述 已知多项式方程: a0+a1x+a2x2+⋯+anxn=0 求这个方程在 [1,m]内的整数解(n 和 m 均为正整数). 输入输出格式 输入格式: 共 n+2 行. 第一行包含 2个整数 ...
- 数学【p1412】 经营与开发(秦九韶算法)
顾z 你没有发现两个字里的blog都不一样嘛 qwq 题目描述-->P1412 经营与开发 分析 虽然看到\(Rank_1\)已经有了解释. 但我认为我能BB的更好 我还是决定来写一篇题解. q ...
- NOIp 2014 解方程 【数学/秦九韶算法/大数取膜】By cellur925
题目传送门 题意:求高次方程的解及其个数.其中 1° 我们知道,高次方程是没有求根公式的.但是利用逆向思维,我们可以进行“试根法”,因为题目中给出了所求根的范围.但是多项式系数过于吓人,达到了sxbk ...
- 【秦九韶算法】【字符串哈希】bzoj3751 [NOIP2014]解方程
在模意义下枚举m进行验证,多设置几个模数,而且小一些,利用f(x+p)%p=f(x)%p降低计算次数.UOJ AC,bzoj OLE. #include<cstdio> #include& ...
- 算法 《霍纳的方法java实践》
[历史背景] 霍纳的方法是中国南宋时期的数学家秦九韶表述求解一元高次多项式的值的算法--正负开方术. 它也能够配合牛顿法用来求解一元高次多项式的根.在西方被称作霍纳算法(Horner algorith ...
随机推荐
- hihoCoder 1041 国庆出游 最详细的解题报告
题目来源:国庆出游 解题思路(下面是大神的写的): 把题目中的序列称作S,树称作T.那么对于S中的任意节点x,x的子孙节点如果在S出现的话,那么这个子孙节点的位置是有一定要求的:x的所有子孙节点在S中 ...
- golang第一天--安装
先上吉祥物 安装 下载链接:https://studygolang.com/dl 下载好之后开始安装 next.next.next,选择好目录.next.等待.finish. 成了!! 配置环境变量: ...
- jsp中获取路径信息的方法
今天在看代码时,发现程序使用了 request.getScheme() .不明白是什么意思,查了一下.结果整理如下: 1.request.getScheme() 返回当前链接使用的协议:一般应用返回h ...
- 集训作业 洛谷P1469 找筷子
这个题的代码真的是短的不得了呢. 有个神奇的东西叫异或,写起来是这个样子的^. 这个东西可以查看2个数的二进制某位是否相同,相同取0,不同取1.虽然我用的不熟,但我可以想出来,如果2个相同的数异或,答 ...
- Spring-Boot 多数据源配置+动态数据源切换+多数据源事物配置实现主从数据库存储分离
一.基础介绍 多数据源字面意思,比如说二个数据库,甚至不同类型的数据库.在用SpringBoot开发项目时,随着业务量的扩大,我们通常会进行数据库拆分或是引入其他数据库,从而我们需要配置多个数据源. ...
- Ordinary - 官方原版软件下载站
官网:http://a-1.vip/exe/
- C++语法小记---自己实现Thread类
自己实现Thread类 在C++的类中,普通成员函数不能作为pthread_create的线程函数,如果要作为pthread_create中的线程函数,必须是static ! 参考:https://b ...
- 17 个 Python 特别实用的操作技巧,记得收藏!
Python 是一门非常优美的语言,其简洁易用令人不得不感概人生苦短.在本文中,作者 Gautham Santhosh 带我们回顾了 17 个非常有用的 Python 技巧,例如查找.分割和合并列表等 ...
- 题解 CF917D 【Stranger Trees】
生成树计数问题用矩阵树定理来考虑. 矩阵树定理求得的为\(\sum\limits_T\prod\limits_{e\in T}v_e\),也就是所有生成树的边权积的和. 这题边是不带权的,应用矩阵树定 ...
- SpringBoot-使用lombok插件运行报错
SpringBoot-使用lombok插件运行报错 标签(空格分隔): java,SpringBoot 1.报错信息 2.解决方案 1.IDEA编辑器安装lombok插件 2.编译注解配置-Enabl ...