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

  • 前言

    其实也没什么好说的吧,三分法就是用来求一个单调函数的最值和满足最大值的\(x\),秦九韶算法就是在\(O(N)\)时间内求一个多项式值

  • 怎么用

    三分法使用--看这篇:https://www.cnblogs.com/Rye-Catcher/p/9255304.html

    函数定义域和值域都为实数呢?

    不多说,先看这道题:https://www.luogu.org/problemnew/show/P3382

    三分法的代码相似,大家应该都知道.哪怎么快速求一个多项式函数的值呢?

    秦九韶算法:计算\(f(x)=\sum^n_{i=0}a[i]x\)

    不太标准的伪代码:

    poly=0
    for i=N to 0
        poly=poly*x+a[i]  
    return poly
  • 例题代码:

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <cctype>
#include <map>
#include <queue>
#define ri register int 
#define ll long long 
using namespace std;
const int maxn=25;
const int inf=0x7fffffff;
const double eps=1e-7;
template <class T>inline void read(T &x){
    x=0;int ne=0;char c;
    while(!isdigit(c=getchar()))ne=c=='-';
    x=c-48;
    while(isdigit(c==getchar()))x=(x<<3)+(x<<1)+c-48;
    x=ne?-x:x;
    return ;
}
int n;
double l,r,a[maxn];
double f(double x){//极好用的秦九韶算法 
double poly=0;
    for(ri i=n;i>=0;i--){
        poly=poly*x+a[i];
    }
    return poly;
}
int main(){
    scanf("%d %lf %lf",&n,&l,&r);
    for(ri i=n;i>=0;i--){
        scanf("%lf",&a[i]);
    }
    double lmid,rmid;
    while(l+eps<r){
        lmid=0.5*(r+l),rmid=0.5*(lmid+r);
        if(f(lmid)<f(rmid))l=lmid;
        else r=rmid;
    }
    printf("%.5lf\n",l);
    return 0;
}

转载于:https://www.cnblogs.com/Rye-Catcher/p/9260599.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值