当前位置: 首页 > article >正文

每日c/c++题 备战蓝桥杯(洛谷P3382 三分法求极值详解)

洛谷P3382 三分法求极值详解

题目描述

P3382 三分法 要求在给定区间内寻找一个多项式函数的最大值点。题目保证函数在区间内先严格递增后严格递减(单峰函数),适合使用三分法求解。

算法原理

三分法核心思想

对于单峰函数,在区间 [ l , r ] [l, r] [l,r] 内每次选取两个试探点 m i d 1 mid1 mid1 m i d 2 mid2 mid2

  • f ( m i d 1 ) < f ( m i d 2 ) f(mid1) < f(mid2) f(mid1)<f(mid2),说明极值点在 ( m i d 1 , r ] (mid1, r] (mid1,r] 区间
  • f ( m i d 1 ) > f ( m i d 2 ) f(mid1) > f(mid2) f(mid1)>f(mid2),说明极值点在 [ l , m i d 2 ) [l, mid2) [l,mid2) 区间
  • 通过不断缩小搜索区间,最终逼近极值点

代码解析与优化

原始代码分析

用户提供的代码存在几个可优化点:

  1. 变量命名不清晰esp 数组应命名为 coeff 更直观
  2. 精度控制方式:固定比较 mid±0.000001 可能不够灵活
  3. 函数返回值设计fun 函数返回 0/1 的布尔逻辑可优化

优化后代码

#include <bits/stdc++.h>
using namespace std;int N;
double l, r;
double coeff[15] = {0};  // 存储多项式系数// 计算多项式在x处的值
double calculate(double x) {double res = 0.0;double x_pow = 1.0;  // 缓存x的幂次for (int i = 0; i <= N; ++i) {res += coeff[i] * x_pow;x_pow *= x;}return res;
}int main() {cin >> N >> l >> r;for (int i = N; i >= 0; --i) {cin >> coeff[i];  // 系数按降序输入}const double EPS = 1e-7;  // 精度控制while (r - l > EPS) {double mid1 = l + (r - l) / 3;double mid2 = r - (r - l) / 3;if (calculate(mid1) < calculate(mid2)) {l = mid1;} else {r = mid2;}}printf("%.5lf\n", l);return 0;
}

关键优化点说明

  1. 函数计算优化

    • 使用迭代计算代替 pow 函数,避免浮点精度问题
    • 时间复杂度从 O(N^2) 优化到 O(N)
  2. 精度控制改进

    • 引入 EPS 常量统一控制精度
    • 终止条件改为 r - l > EPS,更符合三分法收敛特性
  3. 三分点选取策略

    • 采用经典的三分点选取方式:
      mid1 = l + (r - l)/3
      mid2 = r - (r - l)/3
      
    • 保证每次迭代区间缩小比例恒定

注意事项

  1. 单峰性验证:题目保证函数为单峰函数,实际应用中需先验证
  2. 端点处理:当极值点恰好位于区间端点时,需额外判断
  3. 系数输入顺序:注意题目要求系数按降幂输入(与常规存储方式不同)

复杂度分析

  • 时间复杂度:O(N·log(1/ε)),其中 ε 为精度要求
  • 空间复杂度:O(N),仅需存储多项式系数

扩展思考

  1. 与二分法的区别

    • 二分法要求函数单调,三分法要求单峰
    • 三分法每次迭代减少 2/3 的搜索空间
  2. 应用场景

    • 概率分布中的最大似然估计
    • 经济学中的效用最大化问题
    • 工程优化问题中的参数调优

总结

三分法是解决单峰函数极值问题的有效方法,通过不断缩小搜索区间逼近极值点。本题实现时需特别注意:

  1. 浮点数计算的精度控制
  2. 多项式计算的效率优化
  3. 输入输出的格式要求

掌握三分法的实现原理,可以推广到更高维度的优化问题(如网格搜索法),是算法竞赛和工程实践中常用的数值优化技巧。

附:测试样例
输入:
3 -5 5
1 -8 22 -24 8
输出:
3.00000

该样例对应多项式 f ( x ) = x 3 − 8 x 2 + 22 x − 24 x + 8 f(x) = x^3 -8x^2 +22x -24x +8 f(x)=x38x2+22x24x+8,其极大值点确实在 x=3 处。

相关文章:

每日c/c++题 备战蓝桥杯(洛谷P3382 三分法求极值详解)

洛谷P3382 三分法求极值详解 题目描述 P3382 三分法 要求在给定区间内寻找一个多项式函数的最大值点。题目保证函数在区间内先严格递增后严格递减&#xff08;单峰函数&#xff09;&#xff0c;适合使用三分法求解。 算法原理 三分法核心思想 对于单峰函数&#xff0c;在区…...

Vue+css实现扫描动画效果(使用@keyframes scan)

实现效果 扫描效果 参考链接 MDN Web Docs: CSS Animations 关键代码 示例代码 <div class"scanner-container"><div class"scanner-line"></div><div class"scanner-icon">&#x1f4f7;</div><p>Scan m…...

Windows 配置 ssh 秘钥登录 Ubuntu

在 Windows 上推送 SSH 公钥到远程服务器&#xff08;类似于 Linux 上的 ssh-copy-id&#xff09;可以通过以下几种方法实现&#xff1a; ** 手动复制公钥内容** 查看本地公钥内容&#xff1a;type $env:USERPROFILE\.ssh\id_rsa.pub登录远程服务器&#xff0c;将公钥内容粘贴…...

Conda:环境移植及更新1--使用conda-pack

更多内容&#xff1a;XiaoJ的知识星球 目录 一、使用conda-pack1.安装 conda-pack2.移植整个 Anaconda 环境3.移植单个虚拟环境4.验证是否生效 在相同Linux设备上移植Miniconda3&#xff08;Anaconda3同理&#xff09;常用方法有。 使用conda-pack&#xff1a;使用conda-pack工…...

github好玩的工具

以下是 GitHub 上一些有趣且实用的开源工具推荐,涵盖 AI 应用、效率提升、趣味开发等方向,结合最新趋势和项目热度整理: 一、AI 与深度伪造工具 Deep-Live-Cam 仅需一张图片即可在视频直播中实时替换人脸,适用于内容创作和虚拟角色开发,支持多平台硬件运行(如 NVIDIA CUD…...

PHP学习笔记(九)

箭头函数 箭头函数是 PHP 7.4的新语法。是一种更简洁的匿名函数的写法&#xff0c;它们都是closure类的实现。 箭头函数的基本语法为fn&#xff08;argument_list&#xff09; > expr 箭头函数支持与匿名函数相同的功能&#xff0c;只是其父作用域的变量总是自动的。 当表…...

共现矩阵的SVD降维与低维词向量计算详解

共现矩阵的SVD降维与低维词向量计算详解 1. 原始共现矩阵构建 根据用户提供的共现对&#xff1a; 句子1: (I, like), (like, apples)句子2: (I, like), (like, bananas) 词汇表&#xff1a;[I, like, apples, bananas] 窗口大小2&#xff08;假设共现对直接作为矩阵的非零元…...

信创 CDC 实战 | OGG、Attunity……之后,信创数据库实时同步链路如何构建?(以 GaussDB 数据入仓为例)

国产数据库加速进入核心系统&#xff0c;传统同步工具却频频“掉链子”。本系列文章聚焦 OceanBase、GaussDB、TDSQL、达梦等主流信创数据库&#xff0c;逐一拆解其日志机制与同步难点&#xff0c;结合 TapData 的实践经验&#xff0c;系统讲解从 CDC 捕获到实时入仓&#xff0…...

PyQt学习系列08-插件系统与模块化开发

PyQt学习系列笔记&#xff08;Python Qt框架&#xff09; 第八课&#xff1a;插件系统与模块化开发 &#xff08;原课程规划中的第12课&#xff0c;按用户要求调整为第9课&#xff09; 课程目标 掌握Qt插件系统的原理与开发方法实现可扩展的模块化应用程序理解QPluginLoader动…...

Redis核心数据结构操作指南:字符串、哈希、列表详解

注&#xff1a;此为苍穹外卖学习笔记 Redis作为高性能的键值数据库&#xff0c;其核心价值来自于丰富的数据结构支持。本文将深入解析字符串&#xff08;String&#xff09;、哈希&#xff08;Hash&#xff09;、**列表&#xff08;List&#xff09;**三大基础结构的操作命令&…...

微服务(SpringCloud)的简单介绍

一.什么是微服务&#xff1f; 微服务是一种软件架构风格&#xff0c;核心思想是用职责单一的小型项目&#xff0c;组合出复杂的大型项目。 二.举例 1.单体架构&#xff08;SpringBoot&#xff09; 无论项目中有多少功能&#xff0c;都是放在一个项目中。 如下图所示&#xff1…...

Python 爬虫开发

文章目录 1. 常用库安装2. 基础爬虫开发2.1. 使用 requests 获取网页内容2.2. 使用 BeautifulSoup 解析 HTML2.3. 处理登录与会话 3. 进阶爬虫开发3.1. 处理动态加载内容&#xff08;Selenium&#xff09;3.2. 使用Scrapy框架3.3. 分布式爬虫&#xff08;Scrapy-Redis&#xff…...

第十一周作业

一、实现bluecms旁注&#xff0c;并解释为什么旁站攻击可以拿下主站&#xff1f;跨库的意思是什么&#xff1f; 1、为什么旁站攻击可以拿下主站 因为主站业务和旁站业务共处于同一个服务器上面&#xff0c;当我们无法攻破主站业务时&#xff0c;可以通过攻破旁站业务&#xf…...

猿大师办公助手网页编辑Office/wps支持服务器文件多线程下载吗?

浏览器兼容性割裂、信创替代迫切的2025年&#xff0c;传统WebOffice控件因依赖NPAPI/PPAPI插件已无法适配Chrome 107等高版本浏览器。猿大师办公助手通过系统级窗口嵌入技术&#xff0c;直接调用本地Office/WPS内核&#xff0c;实现&#xff1a; 真内嵌非弹窗&#xff1a;将Of…...

英码科技携带 “无感知AI数字课堂”解决方案,亮相第22届广东教育装备展

5月23日至25日&#xff0c;第22届广东教育装备展览会在广州国际采购中心盛大举行。作为华为生态重要合作伙伴&#xff0c;英码科技携“无感知AI数字课堂解决方案”重磅登场&#xff0c;聚焦教学提质增效&#xff0c;为教育数字化转型注入新动能。 聚焦课堂真实场景&#xff0c;…...

各个链接集合

golang学习&#xff5e;&#xff5e;_从数组中取一个相同大小的slice有成本吗?-CSDN博客 框架 golang学习&#xff5e;&#xff5e;_从数组中取一个相同大小的slice有成本吗?-CSDN博客 golang k8s学习_容器化部署和传统部署区别-CSDN博客 K8S rabbitmq_rabbitmq 广播-CSD…...

【R语言科研绘图】

R语言在绘制SCI期刊图像时具有显著优势&#xff0c;以下从功能、灵活性和学术适配性三个方面分析其适用性&#xff1a; 数据可视化库丰富 R语言拥有ggplot2、lattice、ggpubr等专业绘图包&#xff0c;支持生成符合SCI期刊要求的高分辨率图像&#xff08;如TIFF/PDF格式&#…...

Linux Shell 切换

在 Linux 系统中&#xff0c;切换至 Bash Shell 在 Linux 系统中&#xff0c;切换至 Bash Shell 的方法如下&#xff1a; 临时切换到 Bash 直接在终端输入以下命令&#xff0c;启动一个新的 Bash 会话&#xff1a; bash 退出时输入 exit 或按 CtrlD 返回原 Shell。 永久切换…...

ProfiNet转Ethernet/IP网关选型策略适配西门子S7-1500与罗克韦尔ControlLogix5580的关键指标对比

一、行业背景 新能源汽车电池制造是当前工业自动化领域增长最快的细分市场之一。随着动力电池产能扩张与技术迭代&#xff0c;产线对高精度装配、实时数据交互和系统兼容性提出了更高要求。在某头部电池企业的模组装配线中&#xff0c;面临着不同品牌设备通信协议不兼容的问题&…...

AWS WebRTC:获取信令服务节点和ICE服务节点

建立WebRTC的第一步是获取信令服务节点和ICE服务节点。 前提条件是有访问AWS的密钥&#xff0c;主要是ak&#xff0c;sk&#xff0c;token&#xff0c;我这边是业务云有接口可以返回这些信息&#xff0c;所以我直接从业务云获取。 先介绍一下什么是ak&#xff0c;sk&#xff…...

[图文]图6.3会计事项-Fowler分析模式的剖析和实现

1 00:00:02,090 --> 00:00:05,160 Fowler在书里面也说了&#xff0c;6.4 2 00:00:05,290 --> 00:00:07,540 这里也说了 3 00:00:08,030 --> 00:00:11,340 不是常用的 4 00:00:12,520 --> 00:00:15,060 更倾向用6.2&#xff0c;实际上就是6.3了 5 00:00:15,760 …...

[Linux] 利用systemd实现周期性执行任务(DDNS设置案例)

利用systemd实现周期性执行任务 文章目录 利用systemd实现周期性执行任务一、引言二、systemd定时任务基础1. systemd.timer单元的基本概念和工作原理2. systemd.timer与cron的异同对比3. systemd.timer支持的时间规范格式 三、创建systemd定时任务四、管理与监控定时任务1. 定…...

maven 3.0多线程编译提高编译速度

mvn package 默认只使用 单线程 来执行构建生命周期&#xff08;即顺序地构建每一个模块&#xff09;。 如果你使用的是多模块项目&#xff0c;Maven 从 3.0 开始提供了**并行构建&#xff08;parallel build&#xff09;**的能力&#xff0c;但它不是默认开启的。 如何启用多…...

Dalvik虚拟机、ART虚拟机与JVM的核心区别

一、架构设计差异 ​​指令集架构​​ ​​JVM​​&#xff1a;基于​​栈结构​​&#xff0c;所有操作&#xff08;如算术运算、方法调用&#xff09;均依赖操作数栈完成&#xff0c;指令集紧凑但执行效率较低&#xff08;需频繁内存交互&#xff09;。​​Dalvik​​&#x…...

Unity 3D AssetBundle加密解密教程

前言 在Unity中加密和解密AssetBundle可以保护你的资源不被未经授权的访问或篡改。以下是详细的步骤和示例代码&#xff1a; 对惹&#xff0c;这里有一个游戏开发交流小组&#xff0c;希望大家可以点击进来一起交流一下开发经验呀&#xff01; 1. 加密AssetBundle 步骤&…...

【Linux】shell脚本的常用命令

目录 简介 一.设置主机名称 1.1通过文件修改 1.2通过命令修改 二.网络管理命令nmcli 2.1查看网卡 2.2设置网卡 三.简单处理字符 3.1seq打印连续字符 3.2printf,echo打印字符 3.3sort排序 3.4uniq冗余处理 3.5cut对字符的截取 四.xargs输入转参 简介 以下命令都是…...

Netty应用:从零搭建Java游戏服务器网络框架

在游戏开发领域,服务器网络框架是连接玩家与游戏世界的桥梁,其稳定性和高效性直接影响玩家的游戏体验。本文将详细介绍如何使用Java语言和Netty框架,搭建一个兼具TCP和UDP协议支持的游戏服务器网络框架,并配套开发客户端,助你快速掌握游戏网络开发的核心技术。 1.项目概览…...

Pycharm and Flask 的学习心得(9)

request对象&#xff1a; 1. request包含前端发送过来的所有请求数据 将from表单里的内容CV到request里面&#xff0c;可以添加if语句来做判断出请求类型后的操作 在网页上的表单上input的数据&#xff0c;后端如何获取呢&#xff1f; request对象获取前端发送来的数据 // …...

Linux初始-环境安装(2)

文章目录 安装问题&#xff08;1-1.51.39&#xff09;xshell的下载和登录步骤xshell创建多用户与删除用户xshell免密码登录 简介&#xff1a;这篇文章我认为对于初学Linux还是非常重要的&#xff0c;正所谓磨刀不误砍柴工&#xff0c;工具环境准备好了&#xff0c;后面的学习才…...

Nginx 安全防护与 HTTPS 部署实战笔记

Nginx 安全防护与 HTTPS 部署实战笔记 一、核心安全配置 &#xff08;一&#xff09;编译安装 Nginx 安装支持软件 dnf install -y gcc make pcre-devel zlib-devel openssl-devel perl-ExtUtils-MakeMaker git wget tar作用&#xff1a;安装 Nginx 编译所需的开发包&#…...