三分算法與DeepSeek輔助證明是單峰函數

前置

單峰函數有唯一的最大值,最大值左側的數值嚴格單調遞增,最大值右側的數值嚴格單調遞減。

單谷函數有唯一的最小值,最小值左側的數值嚴格單調遞減,最小值右側的數值嚴格單調遞增。

三分的本質

三分和二分一樣都是通過不斷縮小區間范圍直到找到要查的值,優化查找值的時間復雜度。二分是在單調序列中查找一個值,三分是在單峰函數或單谷函數中查找極值。

三分有兩個mid,可確定極值位置,mid1 = L + (R - L) / 3,mid2 = R - (R - L) / 3。對于單峰函數,當f(mid1) < f(mid2)時,mid1和mid2要么在極值左側,要么在極值兩側,這兩種情況極值一定在mid1右側,L = mid1,當f(mid1) > f(mid2)時,mid1和mid2要么在極值右側,要么在極值兩側,這兩種情況極值一定在mid2左側,R? = mid2;

二分沒法在單峰函數或單谷函數中查找極值,因為單峰或單谷函數沒有單調性,所以需要三分。

能用三分則該問題的某部分是單峰或單谷函數。

三分求解步驟

1.問題的某部分是否具有單峰函數或單谷函數的性質。

2.實現三分

三分基礎

P3382 三分 - 洛谷

已明確是單峰函數,可用三分。

代碼如下:

#include <iostream>
#include <iomanip>
#include <cmath>
using namespace std;typedef long long LL;const LL Maxn = 15;double vct[Maxn];double func(double x, LL n) {double res = 0.0;double x_pow = 1.0;for (LL i = 0; i <= n; ++i) {res += vct[i] * x_pow;x_pow *= x;}return res;
}int main() {ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);LL n;double L, R, eps = 1e-7, mid;cin >> n >> L >> R;for (LL i = n; i >= 0; --i)  cin >> vct[i];while (L + eps <  R) {mid = (L + R) / 2;if (func(mid - eps, n) > func(mid + eps, n))  R = mid;else  L = mid;}cout << fixed << setprecision(5) << L;return 0;
}

注意精度,精度的處理類似實數域中的二分做法。

一般mid1取[L, R]的三分之一位置,mid2取[L, R]的三分之二位置,如此每次區間縮小到區間的三分之二,若mid1,mid2,取[L, R]的二分之一的位置的左右兩側,則區間每次縮小到區間的二分之一左右,時間復雜度接近二分。

三分套三分

P2571 [SCOI2010] 傳送帶 - 洛谷

兩點間中的所有線直線的距離最短,所以都走直線,那么大概走法如下圖,只需確定E點和F點即可。

設兩點間的直線距離為dis(x, y),走的總距離為S?= dis(A, E) / P?+ dis(E, F) / R + dis(F, D) / Q。設E已知,則只需關心f(E) = dis(E, F) / R + dis(F, D) / Q,若f(E)是個單峰或單谷函數即可用三分查找F的最優解,此時 S = dis(A, E) / p + f(E),若dis(A, E) / p + f(E)是個單峰或單谷函數即可用三分查找E的最優解,需要嚴格的數學證明,可我不會,就問了DeepSeek,它給出了如下圖的詳細證明。

DeepSeek證明了一定是單峰函數,則可用三分法求解。

代碼如下:

#include <iostream>
#include <iomanip>
#include <cmath>
using namespace std;typedef long long LL;const double eps = 1e-8;double ax, ay, bx, by, cx, cy, dx, dy, p, Q, r;double getDis(double nx, double ny, double mx, double my) {return sqrt((nx - mx) * (nx - mx) + (ny - my) * (ny - my));
}double in_ter(double ex, double ey) {double Lx = cx, Ly = cy, Rx = dx, Ry = dy;double f1x = 0.0, f1y = 0.0, f2x = 0.0, f2y = 0.0, t1 = 0.0, t2 = 0.0;while (getDis(Lx, Ly, Rx, Ry) > eps) {f1x = Lx + (Rx - Lx) / 3.0;f1y = Ly + (Ry - Ly) / 3.0;f2x = Rx - (Rx - Lx) / 3.0;f2y = Ry - (Ry - Ly) / 3.0;t1 = getDis(ex, ey, f1x, f1y) / r + getDis(f1x, f1y, dx, dy) / Q;t2 = getDis(ex, ey, f2x, f2y) / r + getDis(f2x, f2y, dx, dy) / Q;if (t1 < t2) {Rx = f2x;Ry = f2y;} else {Lx = f1x;Ly = f1y;}}return getDis(ex, ey, Lx, Ly) / r + getDis(Lx, Ly, dx, dy) / Q;
}double out_ter() {double Lx = ax, Ly = ay, Rx = bx, Ry = by;double e1x = 0.0, e1y = 0.0, e2x = 0.0, e2y = 0.0, t1 = 0.0, t2 = 0.0;while (getDis(Lx, Ly, Rx, Ry) > eps) {e1x = Lx + (Rx - Lx) / 3.0;e1y = Ly + (Ry - Ly) / 3.0;e2x = Rx - (Rx - Lx) / 3.0;e2y = Ry - (Ry - Ly) / 3.0;t1 = getDis(ax, ay, e1x, e1y) / p + in_ter(e1x, e1y);t2 = getDis(ax, ay, e2x, e2y) / p + in_ter(e2x, e2y);if (t1 < t2) {Rx = e2x;Ry = e2y;} else {Lx = e1x;Ly = e1y;}}return getDis(ax, ay, Lx, Ly) / p + in_ter(Lx, Ly);
}int main() {ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);cin >> ax >> ay >> bx >> by >> cx >> cy >> dx >> dy >> p >> Q >> r;if (getDis(ax, ay, bx, by) < eps) {cout << fixed << setprecision(2) << in_ter(ax, ay);} else {cout << fixed << setprecision(2) << out_ter();}return 0;
}

最后的值是double型的,雖然輸入數據是整數,但用double型表示,避免轉換。

f1x為Lx,Rx三分之一的位置,f1y為Ly,Ry三分之一的位置,坐標必須能對在一起,否則(f1x,f1t)不在線段AB上。

總結

數學很重要,P2571就需要數學,沒有數學證明是沒法用三分的,也就沒法寫出這篇實現代碼。要練習使用AI工具,缺知識的時候AI工具會派上大用場,關鍵是拆解問題規模,提出明確的問題。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/83990.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/83990.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/83990.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

安全月報 | 傲盾DDoS攻擊防御2025年5月簡報

引言 在2025年5月&#xff0c;全球數字化進程高歌猛進&#xff0c;各行各業深度融入數字浪潮&#xff0c;人工智能、物聯網、大數據等前沿技術蓬勃發展&#xff0c;進一步夯實了數字經濟的基石。然而&#xff0c;在這看似繁榮的數字生態背后&#xff0c;網絡安全威脅正以驚人的…

【Spring】Spring哪些源碼解決了哪些問題P1

歡迎來到啾啾的博客&#x1f431;。 記錄學習點滴。分享工作思考和實用技巧&#xff0c;偶爾也分享一些雜談&#x1f4ac;。 有很多很多不足的地方&#xff0c;歡迎評論交流&#xff0c;感謝您的閱讀和評論&#x1f604;。 目錄 Spring是怎么處理請求的&#xff1f;Spring請求方…

堅持每日Codeforces三題挑戰:Day 4 - 題目詳解(2025-06-07,難度:1000, 1100, 1400)

前言&#xff1a; 此文章主要是記錄每天的codeforces刷題&#xff0c;還有就是給其他打算法競賽的人一點點點點小小的幫助&#xff08;畢竟現在實力比較菜&#xff0c;題目比較簡單&#xff0c;但我還是會認真寫題解&#xff09;。 之前忙學校事情&#xff0c;懈怠了一段時間…

6.7本日總結

一、英語 復習默寫list10list19&#xff0c;07年第3篇閱讀 二、數學 學習線代第一講&#xff0c;寫15講課后題 三、408 學習計組第二章&#xff0c;寫計組習題 四、總結 本周結束線代第一講和計組第二章&#xff0c;之后學習計網4.4&#xff0c;學完計網4.4之后開操作系…

PGSR : 基于平面的高斯濺射高保真表面重建【全流程分析與測試!】【2025最新版!!】

【PGSR】: 基于平面的高斯濺射高保真表面重建 前言 三維表面重建是計算機視覺和計算機圖形學領域的核心問題之一。隨著Neural Radiance Fields (NeRF)和3D Gaussian Splatting (3DGS)技術的發展&#xff0c;從多視角RGB圖像重建高質量三維表面成為了研究熱點。今天我們要深入…

從認識AI開始-----AutoEncoder:生成模型的起點

前言 從15年開始&#xff0c;在深度學習的重要模型中&#xff0c;AutoEncoder&#xff08;自編碼器&#xff09;可以說是打開生成模型世界的起點。它不僅是壓縮與重建的工具&#xff0c;更是VAE、GAN、DIffusion等復雜生成模型的思想起源。其實AutoEncoder并不復雜&#xff0c;…

解決MySQL8.4報錯ERROR 1524 (HY000): Plugin ‘mysql_native_password‘ is not loaded

最近使用了MySQL8.4 , 服務啟動成功,但是就是無法登陸,并且報錯: ERROR 1524 (HY000): Plugin mysql_native_password is not loaded 使用如下的命令也報錯 mysql -u root -p -P 3306 問題分析: 在MySQL 8.0版本中,默認的認證插件從mysql_native_password變更為cachi…

TDengine 開發指南——無模式寫入

簡介 在物聯網應用中&#xff0c;為了實現自動化管理、業務分析和設備監控等多種功能&#xff0c;通常需要采集大量的數據項。然而&#xff0c;由于應用邏輯的版本升級和設備自身的硬件調整等原因&#xff0c;數據采集項可能會頻繁發生變化。為了應對這種挑戰&#xff0c;TDen…

嵌入式面試高頻(5)!!!C++語言(嵌入式八股文,嵌入式面經)

一、C有幾種傳值方式之間的區別 一、值傳遞&#xff08;Pass by Value&#xff09; 機制&#xff1a;創建參數的副本&#xff0c;函數內操作不影響原始數據語法&#xff1a;void func(int x)特點&#xff1a; 數據安全&#xff1a;原始數據不受影響性能開銷&#xff1a;需要復…

Spark 之 AQE

個人其他鏈接 AQE 執行順序https://blog.csdn.net/zhixingheyi_tian/article/details/125112793 AQE 產生 AQE 的 循環觸發點 src/main/scala/org/apache/spark/sql/execution/adaptive/AdaptiveSparkPlanExec.scala override def doExecute(): RDD[InternalRow] = {withFin…

FSMC擴展外部SRAM

提示&#xff1a;文章 文章目錄 前言一、背景二、2.12.2 三、3.1 總結 前言 前期疑問&#xff1a; 本文目標&#xff1a; 一、背景 2025年6月7日 19:34:48 今天看了FSMC擴展外部SRAM的文章&#xff0c;大概理解到stm32除了內部存儲器&#xff0c;還可以擴展外部存儲器。其中s…

【CSS-6】深入理解CSS復合選擇器:提升樣式表的精確性與效率

CSS選擇器是前端開發的基石&#xff0c;而復合選擇器則是其中最強大且實用的工具之一。本文將全面解析CSS復合選擇器的類型、用法、優先級規則以及最佳實踐&#xff0c;幫助你編寫更高效、更精確的樣式表。 1. 什么是復合選擇器&#xff1f; 復合選擇器是通過組合多個簡單選擇…

使用python實現奔跑的線條效果

效果&#xff0c;展示&#xff08;視頻效果展示&#xff09;&#xff1a; 奔跑的線條 from turtle import * import time t1Turtle() t2Turtle() t3Turtle() t1.hideturtle() t2.hideturtle() t3.hideturtle() t1.pencolor("red") t2.pencolor("green") t3…

從零搭建uniapp項目

目錄 創建uni-app項目 基礎架構 安裝 uni-ui 組件庫 安裝sass依賴 easycom配置組件自動導入 配置view等標簽高亮聲明 配置uni-ui組件類型聲明 解決 標簽 錯誤 關于tsconfig.json中提示報錯 關于非原生標簽錯誤&#xff08;看運氣&#xff09; 安裝 uview-plus 組件庫…

Redis主從復制的原理一 之 概述

概述 本文概要性的介紹了Redis主從復制原理&#xff0c;及新舊版本主從復制的區別&#xff0c;優缺點。具體的主從復制過程可詳見「Redis主從復制原理二 之 主從復制工作流程」 舊版主從復制的實現 Redis的復制功能分為 同步&#xff08;sync&#xff09;和 命令傳播&#xff…

網絡原理 4-TCP3

上篇文章&#xff0c;我們講了TCP協議的連接管理&#xff08;”三次握手“和”四次揮手“的過程&#xff09;。 4、滑動窗口 這個滑動窗口是TCP中非常有特點的機制。我們知道&#xff0c;TCP是通過前面講的三個機制&#xff1a;確認應答&#xff0c;超時重傳&#xff0c;連接…

【使用 Loki + Promtail + Grafana 搭建輕量級容器日志分析平臺】

使用 Loki Promtail Grafana 搭建輕量級容器日志分析平臺 摘要 本文介紹如何通過 Docker Compose 快速搭建 Loki 日志存儲、Promtail 日志采集和 Grafana 日志可視化/告警的完整流程。用最小化示例演示核心配置、常見問題排查和告警規則設置&#xff0c;幫助讀者快速上手。…

CRMEB 中 PHP 快遞查詢擴展實現:涵蓋一號通、阿里云、騰訊云

目前已有一號通快遞查詢、阿里云快遞查詢擴展 擴展入口文件 文件目錄 crmeb\services\express\Express.php 默認一號通快遞查詢 namespace crmeb\services\express;use crmeb\basic\BaseManager; use crmeb\services\AccessTokenServeService; use think\Container; use thi…

使用 Python 自動化 Word 文檔樣式復制與內容生成

在辦公自動化領域&#xff0c;如何高效地處理 Word 文檔的樣式和內容復制是一個常見需求。本文將通過一個完整的代碼示例&#xff0c;展示如何利用 Python 的 python-docx 庫實現 Word 文檔樣式的深度復制 和 動態內容生成&#xff0c;并結合知識庫中的最佳實踐優化文檔處理流程…

【MATLAB代碼】基于MCC(最大相關熵)的EKF,一維濾波,用于解決觀測噪聲的異常|附完整代碼,訂閱專欄后可直接查看

本文所述的代碼實現了一種基于最大相關熵準則(Maximum Correntropy Criterion, MCC)的魯棒性卡爾曼濾波算法(MCC-KF),重點解決傳統卡爾曼濾波在觀測噪聲存在異常值時估計精度下降的問題。通過引入高斯核函數對殘差進行加權處理,有效降低了異常觀測值對狀態估計的干擾。訂…