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

三分算法的简单应用

三分算法的简单应用三分算法三分算法求函数极值P1883 Error Curves - 洛谷P5931 灯泡 - 洛谷P2571 传送带 - 洛谷OJ参考三分算法二分法在单调函数上查找特定值或在有序数组中搜索目标依赖于函数在区间内具有单调性从而能够通过一次比较确定目标所在的半区间。但很多问题需要求凹函数或凸函数的极值凹函数在极值点两侧函数的单调性相反一侧递增另一侧递减。此时用二分法取中点时无法通过比较中点处的函数值与某个参考值来判断极值点位于中点的左侧还是右侧因为函数值的大小关系并不能唯一确定方向。三分法适用于求解凸性函数的极值问题二次函数就是一个典型的单峰函数。 三分法与二分法一样它会不断缩小答案所在的求解区间。二分法缩小区间利用的原理是函数的单调性而三分法利用的则是函数的单峰性。至于为什么不用求导的方式求极值是因为某些问题中需要求极值点的单峰函数并非一个单独的函数而是多个函数进行特殊运算得到的函数甚至是抽象函数或分段函数。此时在函数某些点上可能不可导。例如求多个单调性不完全相同的一次函数组成的分段函数的最小值的最大值就不能用求导来求解。三分算法求函数极值设当前求解的区间为[l,r]令m1 l(r-l)/3m2r-(r-l)/3接着计算这两个点的函数值f(m1),f(m2)之后将两点中函数值更优的那个点称为好点若计算最大值则f(m)更大的那个点 就为好点计算最小值同理而函数值较差的那个点称为坏点。可以证明最优点与好点会与坏点同侧。如图所示f(m1)f(m2)则m1是好点而m2是坏点因此最后的最优点会与m1一起在m2的左侧即我们的求解区间由[l,r]变为了[l,m2]。因此根据这个结论我们可以不停缩小求解区间直至得出近似解。 与二分一样我们可以指定三分的次数或是根据r-l的值来终止算法。以求上凸单峰函数的最大值为例三分模板doublefind(doublel,doubler){constdoubledlt1e-10;while(r-ldlt){doublem1l(r-l)/3;doublem2r-(r-l)/3;if(f(m1)f(m2))// m1比m2更靠近极值lm1;elserm2;}returnf(l);// 极值点这里lr}三分算法也可以用在单调函数上但求得的是 2 个端点的值。常出现的题目大致有求某个拥有具体解析式和定义域的函数的极值和优化枚举其中的函数需要现场分析和推理很考验个人的数学能力。P1883 Error Curves - 洛谷[P1883 【模板】三分 / 函数 / ICPC 2010 Chengdu R] Error Curves - 洛谷1435【例题3】曲线一堆二次函数组合在一起的叠加函数因为a 0 a0a0所以在[0,1000]可能单调递增也可能是先单调递减后单调递增。但无论是什么情况这个函数在[0,1000]都可以看做凹函数或单调函数然后对这个函数求最小值可以尝试三分。#includebits/stdc.husingnamespacestd;constdoubledlt1e-11;vectordoublea,b,c;intn;inlinedoublef(doublex){doubleansa[1]*x*xb[1]*xc[1];for(inti1;ia.size();i)ansmax(ans,a[i]*x*xb[i]*xc[i]);returnans;}voidac(){cinn;a.resize(n1,0);bca;for(inti1;in;i)cina[i]b[i]c[i];doublel0,r1000.0;while(r-ldlt){doublem1f(l(r-l)/3);doublem2f(r-(r-l)/3);if(m1m2)// 凹函数m1比m2更接近极值rr-(r-l)/3;elsell(r-l)/3;}printf(%.4lf\n,f(r));}intmain(){// freopen(in.in, r, stdin);intT1;cinT;while(T--)ac();return0;}P5931 灯泡 - 洛谷[P5931 清华集训 2015] 灯泡 - 洛谷1438灯泡题图如图所示但实际上根据D DD和h hh的变化会出现不同的情况。当影子仅出现在地面时如图所示根据三角形的相似性有L D L L x h H \frac{L}{D}\frac{L}{Lx}\frac{h}{H}DL​LxL​Hh​交叉相乘再移项得L h H − h x L\frac{h}{H-h}xLH−hh​x。随着x xx增大当x L D xLDxLD时影子L LL最长否则影子就会有一部分到墙上。影子L LL最长时x D − L H − h H D xD-L\frac{H-h}{H}DxD−LHH−h​D。也就是说当影子在地面上时x H − h H D x\frac{H-h}{H}DxHH−h​D。当影子出现在墙壁时如图所示根据相似三角形的性质有e d f g D − x D \frac{ed}{fg}\frac{D-x}{D}fged​DD−x​即h − L D − x H − L D − x D − x D \frac{h-LD-x}{H-LD-x}\frac{D-x}{D}H−LD−xh−LD−x​DD−x​。2 边同时乘以 2 个分母的乘积得h D − L D D 2 − D x ( H D − x ) ( D − x ) − L ( D − x ) hD-LDD^2-Dx(HD-x)(D-x)-L(D-x)hD−LDD2−Dx(HD−x)(D−x)−L(D−x)将要求的答案L LL移项到左边其余移项到右边得L ( H D − x ) ( D − x ) − h D − D 2 D x − x H D − H x D 2 − D x − D x x 2 − h D − D 2 D x − x H D − H x − D x x 2 − h D − x − x − ( H − h ) D x H D \begin{aligned}L\frac{(HD-x)(D-x)-hD-D^2Dx}{-x}\\\frac{HD-HxD^2-Dx-Dxx^2-hD-D^2Dx}{-x}\\\frac{HD-Hx -Dxx^2-hD }{-x}\\-x-\frac{(H-h)D}{x}HD\end{aligned}L​−x(HD−x)(D−x)−hD−D2Dx​−xHD−HxD2−Dx−Dxx2−hD−D2Dx​−xHD−Hx−Dxx2−hD​−x−x(H−h)D​HD​L − x − ( H − h ) D x H D L-x-\frac{(H-h)D}{x}HDL−x−x(H−h)D​HD是一个对勾函数在x ∈ [ 0 , ∞ ] x\in [0,\infty]x∈[0,∞]是凹函数。题目要求最大的影子长度则函数L LL的定义域应为[ H − h H D , D ] [\frac{H-h}{H}D,D][HH−h​D,D]在这个范围内L LL函数要么是单调函数要么是凹函数但无论是哪一个都能使用三分算法求得极值。[P5931 清华集训 2015] 灯泡 - 洛谷 和1438灯泡 参考#includebits/stdc.husingnamespacestd;doublef(doubleH,doubleh,doubleD,doublex){return(-x-((D*(H-h))/x)HD);}intmain(){// freopen(in.in, r, stdin);intT0;cinT;while(T--){doubleH,h,D;cinHhD;doubleL(H-h)*D/H,RD;while(R-L1e-9){doublem1L(R-L)/3,m2R-(R-L)/3;if(f(H,h,D,m1)f(H,h,D,m2))Lm1;// m2更靠近极值点elseRm2;}printf(%.3lf\n,f(H,h,D,L));}return0;}P2571 传送带 - 洛谷1439【SCOI2010】传送带[P2571 SCOI2010] 传送带 - 洛谷题目测试样例如图容易想到若点E EE固定则F FF从C CC移动 到D DD整体移动时间由长变短再变长这是一个单峰函数此时可以用三分算法。但因为E EE也是动点所以也要对E EE进行枚举。但对E EE的轨迹用二分枚举的话就无法获得下一步行动所以对E EE的轨迹也用三分。这题可以求函数解析式但最后的结果是个二元函数同样是使用三分优化E EE和F FF的枚举这里就不推导了。参考程序#includebits/stdc.husingnamespacestd;usingf64double;f64 ax,ay,bx,by,cx,cy,dx,dy,P,Q,R;booleq(f64 x,f64 y){returnfabs(x-y)1e-9;}voidmidl(f64aim,f64x,f64y){// 左端点收缩aimx(y-x)/3;};voidmidr(f64aim,f64x,f64y){// 右端点收缩aimy-(y-x)/3;};f64dis(f64 x1,f64 y1,f64 x2,f64 y2){// 计算2点间距f64 xx1-x2,yy1-y2;returnsqrt(x*xy*y);}f64tim(f64 x1,f64 y1,f64 x2,f64 y2){// 计算费时f64 dabdis(x1,y1,ax,ay);f64 dcddis(x2,y2,dx,dy);f64 d12dis(x1,y1,x2,y2);returndab/Pdcd/Qd12/R;}f64TCD(f64 x,f64 y){// 枚举F点f64 lxcx,lycy,rxdx,rydy;f64 mlx,mly,mrx,mry;while(!(eq(lx,rx)eq(ly,ry))){midl(mlx,lx,rx),midl(mly,ly,ry);midr(mrx,lx,rx),midr(mry,ly,ry);if(tim(x,y,mlx,mly)tim(x,y,mrx,mry))rxmrx,rymry;// ml更接近最优解elselxmlx,lymly;}returntim(x,y,lx,ly);}f64TAB(){// 枚举E点f64 lxax,lyay,rxbx,ryby;f64 mlx,mly,mrx,mry;while(!(eq(lx,rx)eq(ly,ry))){midl(mlx,lx,rx),midl(mly,ly,ry);midr(mrx,lx,rx),midr(mry,ly,ry);if(TCD(mlx,mly)TCD(mrx,mry))// ml更接近最优解rxmrx,rymry;elselxmlx,lymly;}returnTCD(mlx,mly);}intmain(){// freopen(in.in, r, stdin);cinaxaybxby;cincxcydxdy;cinPQR;printf(%.2lf,TAB());return0;}这题解法很多有模拟退火、暴力枚举、三分嵌套三分这里只举例三分嵌套三分。OJ参考[P1883 【模板】三分 / 函数 / ICPC 2010 Chengdu R] Error Curves - 洛谷1435【例题3】曲线[P5931 清华集训 2015] 灯泡 - 洛谷1438灯泡1439【SCOI2010】传送带[P2571 SCOI2010] 传送带 - 洛谷

相关文章:

三分算法的简单应用

三分算法的简单应用三分算法三分算法求函数极值P1883 Error Curves - 洛谷P5931 灯泡 - 洛谷P2571 传送带 - 洛谷OJ参考三分算法 二分法在单调函数上查找特定值或在有序数组中搜索目标,依赖于函数在区间内具有单调性,从而能够通过一次比较确定目标所在的…...

Linux操作系统之线程:信号量sem

前言: 大家好啊,我们上一篇文章已经讲解了关于线程同步的一种办法:运用条件变量cond。 今天,我们就来学习一下线程同步的另外一种方法,信号量!! 信号量呢有System V 信号量与POSIX 信号量&am…...

网易云信Web语音通信实战:从零封装一个Vue3语音聊天组件

Vue3网易云信Web语音通信组件开发实战 语音交互正在成为现代Web应用的重要功能模块。本文将带您从零开始,基于Vue3组合式API和网易云信Web SDK,构建一个企业级可复用的语音聊天组件。不同于简单的SDK集成教程,我们将重点探讨工程化实践中的关…...

OpenCore Auxiliary Tools:黑苹果配置的一站式解决方案

OpenCore Auxiliary Tools:黑苹果配置的一站式解决方案 【免费下载链接】OCAuxiliaryTools Cross-platform GUI management tools for OpenCore(OCAT) 项目地址: https://gitcode.com/gh_mirrors/oc/OCAuxiliaryTools 价值主张&#x…...

Step3-VL-10B-Base一键部署教程:基于Docker的快速环境搭建指南

Step3-VL-10B-Base一键部署教程:基于Docker的快速环境搭建指南 想试试那个能看懂图片还能跟你聊天的多模态大模型吗?Step3-VL-10B-Base最近挺火的,但一想到要配环境、装依赖、处理各种版本冲突,是不是头都大了?别担心…...

SPX截图神器隐藏玩法:除了撕边效果,还能批量给图片加动态水印?

SPX截图神器进阶指南:从动态水印到高效办公的全能玩法 在数字办公时代,截图工具早已不再是简单的屏幕捕捉软件。SPX Instant Screen Capture作为一款轻量级却功能强大的截图工具,其隐藏的高级功能可以显著提升工作效率。本文将深入探索SPX的进…...

前端必学:纯CSS+JS实现div拖拽调整大小(兼容上下左右方向)

原生JavaScript实现多方向Div拖拽调整的工程化实践 在构建现代Web应用时,动态调整界面布局的能力往往能显著提升用户体验。想象一下:一个数据分析面板需要同时展示代码编辑器、可视化图表和实时日志,用户通过简单拖拽就能自由分配屏幕空间——…...

opencode与Proteus联合应用:嵌入式开发AI辅助完整指南

OpenCode与Proteus联合应用:嵌入式开发AI辅助完整指南 1. 引言:当AI编程助手遇上嵌入式仿真 如果你是一名嵌入式开发者,一定经历过这样的场景:深夜调试代码,一个简单的串口通信问题卡了几个小时;或者面对…...

数字图像处理:从理论到实战的快速通关指南

1. 数字图像处理入门:从像素到矩阵 第一次接触数字图像处理时,我被一个简单的问题难住了:电脑屏幕上的照片究竟是怎么存储的?后来才发现,所有的秘密都藏在那些小小的像素点里。想象一下,当你用放大镜看报纸…...

Mirage Flow 实战:三天从零搭建一个行业智能顾问原型

Mirage Flow 实战:三天从零搭建一个行业智能顾问原型 你是不是也想过,要是能有个懂行的AI顾问该多好?比如,一个能帮你分析跨境电商选品趋势的助手,或者一个能快速解答客户问题的智能客服,甚至是一个能帮你…...

SystemC内核调度揭秘:SC_THREAD和SC_METHOD在仿真中的执行机制详解

SystemC内核调度揭秘:SC_THREAD和SC_METHOD在仿真中的执行机制详解 SystemC作为硬件描述和验证语言的核心价值,在于其精确模拟硬件并行性的能力。这种能力很大程度上依赖于内核调度机制对SC_THREAD和SC_METHOD两种进程类型的差异化处理。理解这些底层原理…...

Unity移动物体别再只用Update了!协程、iTween、Lerp实战对比与避坑指南

Unity移动物体方案深度对比:从协程到iTween的实战避坑指南 在Unity开发中,物体移动是最基础也最频繁的需求之一。很多开发者习惯性地在Update中直接修改Transform,但这种方式往往会导致性能浪费、代码难以维护,甚至产生意想不到的…...

Android模糊视图深度解析:从技术原理到实战应用的艺术

Android模糊视图深度解析:从技术原理到实战应用的艺术 【免费下载链接】BlurView Android blur view 项目地址: https://gitcode.com/gh_mirrors/blu/BlurView 在现代移动应用设计中,毛玻璃模糊效果已成为提升界面层次感和视觉美感的标配功能。Bl…...

Realistic Vision V5.1虚拟摄影棚效果对比:vs SDXL写实向生成质量实测

Realistic Vision V5.1虚拟摄影棚效果对比:vs SDXL写实向生成质量实测 1. 项目概述 Realistic Vision V5.1虚拟摄影棚是基于当前SD 1.5生态中最强大的写实模型开发的本地化工具。这个解决方案通过深度优化,让普通用户也能轻松生成专业级摄影作品&#…...

用LDA主题模型分析新闻分类:从数据清洗到模型优化的完整实战

LDA主题模型实战:从新闻分类到业务落地的全流程解析 在信息爆炸的时代,如何从海量文本中自动提取关键主题并实现智能分类,成为数据科学家和NLP工程师的核心挑战。本文将带您深入LDA主题模型的工业级应用实践,从理论到代码实现&…...

Java 同城跑腿小程序源码解析:代买代送服务流程实现

以下基于Java同城跑腿小程序源码,深度解析代买代送服务流程的核心实现逻辑,结合技术架构与代码示例展开说明:一、用户下单与需求解析需求接收与校验:用户通过小程序选择“代买”或“代送”,填写取件地址、收件地址、物…...

别再死记硬背了!用Python手把手复现神经网络经典算法(从Hebb到Hopfield)

用Python从零实现神经网络五大经典算法:从Hebb到Hopfield 神经网络作为人工智能的核心技术之一,其发展历程中涌现出许多奠基性算法。本文将带您用Python从零实现五种里程碑式的神经网络算法:Hebb规则、感知机、Delta规则、竞争学习和Hopfield…...

Qwen3.5-9B图文问答实战:上传图片→自动识别→多轮推理演示

Qwen3.5-9B图文问答实战:上传图片→自动识别→多轮推理演示 1. 引言 你是否遇到过这样的情况:看到一张复杂的图表或产品图片,却不知道如何准确描述它的内容?或者需要从大量图片中快速提取关键信息?Qwen3.5-9B图文问答…...

Nanbeige 4.1-3B实战指南:将传统Chat UI升级为JRPG冒险终端

Nanbeige 4.1-3B实战指南:将传统Chat UI升级为JRPG冒险终端 1. 项目概述 Nanbeige 4.1-3B像素冒险聊天终端是一套专为Nanbeige大模型设计的游戏化交互界面。这个项目将传统聊天机器人界面彻底改造为充满怀旧感的JRPG(日式角色扮演游戏)风格终端,让每一…...

硬件电路系统化设计方法论:从需求到量产的工程路径

1. 硬件电路系统化设计方法论:从理论到工程落地的完整路径在嵌入式硬件开发实践中,一个普遍存在的现象是:工程师掌握了大量分立的电路理论知识,能熟练分析运放电路、理解MOSFET开关特性、背诵ADC采样定理,却在真正面对…...

GLM-OCR与C语言结合实战:嵌入式设备上的轻量级文字识别

GLM-OCR与C语言结合实战:嵌入式设备上的轻量级文字识别 你是不是也遇到过这样的场景?手里有个基于STM32的小设备,想让它能“看懂”一些简单的文字,比如识别仪表盘上的读数、读取产品标签上的批次号,或者扫描一个简单的…...

Cogito-v1-preview-llama-3B效果展示:多语言API文档生成(中/英/西)

Cogito-v1-preview-llama-3B效果展示:多语言API文档生成(中/英/西) 想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域&…...

从信号处理到AI推理:用CUDA手把手实现一个高性能1D卷积核(附四种优化策略对比)

从信号处理到AI推理:用CUDA手把手实现一个高性能1D卷积核(附四种优化策略对比) 在音频降噪、金融时间序列分析和自然语言处理中,1D卷积都是核心操作。当标准深度学习框架的卷积层成为性能瓶颈时,定制化的CUDA实现往往能…...

如何解锁群晖NAS硬盘兼容性:Synology HDD db完整配置指南

如何解锁群晖NAS硬盘兼容性:Synology HDD db完整配置指南 【免费下载链接】Synology_HDD_db 项目地址: https://gitcode.com/GitHub_Trending/sy/Synology_HDD_db Synology HDD db是一个专为群晖NAS用户设计的强大兼容性解决方案,它能够将第三方…...

Xinference多模态应用实战:从零搭建图片理解聊天机器人

Xinference多模态应用实战:从零搭建图片理解聊天机器人 1. 引言:为什么选择Xinference搭建聊天机器人 你是否想过开发一个能真正理解图片内容的智能助手?想象一下,上传一张照片,AI不仅能描述画面内容,还能…...

SenseVoice语音识别效果实测:中英混合语音转文字准确率展示

SenseVoice语音识别效果实测:中英混合语音转文字准确率展示 1. 测试背景与模型介绍 语音识别技术在日常生活中的应用越来越广泛,从会议记录到视频字幕生成,都离不开这项核心技术。今天我们要测试的是SenseVoice-small-onnx语音识别模型&…...

java微信小程序积分商城购物系跑腿配送系统_09ok4

目录实现计划概述技术栈选择核心模块划分数据库设计关键逻辑实现测试与部署时间规划注意事项项目技术支持可定制开发之功能创新亮点源码获取详细视频演示 :文章底部获取博主联系方式!同行可合作实现计划概述 开发一个基于Java的微信小程序积分商城与跑腿…...

Visual Studio深度清理指南:从残留困境到环境净化

Visual Studio深度清理指南:从残留困境到环境净化 【免费下载链接】VisualStudioUninstaller Visual Studio Uninstallation sometimes can be unreliable and often leave out a lot of unwanted artifacts. Visual Studio Uninstaller is designed to thoroughly …...

Qwen3-32B-Chat跨境电商应用:多语言商品描述、平台规则解读、客服话术生成

Qwen3-32B-Chat跨境电商应用:多语言商品描述、平台规则解读、客服话术生成 1. 跨境电商AI助手解决方案 跨境电商行业面临着多语言沟通、平台规则复杂、客服效率低下等痛点。Qwen3-32B-Chat私有部署镜像为这些挑战提供了智能化解决方案,基于RTX4090D 24…...

4.2.3 存储->POSIX 文件系统标准(IEEE,ISO IEC 采纳):ext4(Fourth Extended File System)第四代扩展文件系统

Linux 系统中最经典、应用最广泛的标准文件系统之一,由 ext3 升级而来,解决了前代的容量瓶颈和性能短板,同时保持了良好的向下兼容性,是很多 Linux 发行版(如 Debian、Ubuntu)的默认文件系统 一、 核心定位…...