O(log n) 时间内求解最大可选元素个数:基于等差数列前缀和的高效算法

小枫吖_2983

小枫吖_2983

2026-07-25

173人浏览

原创

O(log n) 时间内求解最大可选元素个数:基于等差数列前缀和的高效算法

本文介绍如何在 O(log n) 时间内求解有序向量 V = ⟨v₁, …, vₙ⟩(其中 vᵢ = 5×i)中,最多可选取多少个互异元素,使其总和 ≤ M;核心在于利用等差数列求和公式与二分搜索,避免线性扫描。

本文介绍如何在 o(log n) 时间内求解有序向量 v = ⟨v₁, …, vₙ⟩(其中 vᵢ = 5×i)中,最多可选取多少个**互异元素**,使其总和 ≤ m;核心在于利用等差数列求和公式与二分搜索,避免线性扫描。

该问题表面是“背包式选择”,实则具有强结构约束:向量 V 的元素严格按索引线性增长(vᵢ = 5i),且题目要求选取尽可能多的元素(而非最大化价值),而元素已天然有序——最小的元素排在最前(v₁=5, v₂=10, …)。因此,贪心策略最优:总是优先选最小的未选元素。即,最优解必为前 k 个元素 {v₁, v₂, ..., vₖ},因为任何跳过小元素而选更大元素的方案,都会在相同数量下导致和更大,或在相同和限制下容纳更少元素。

于是问题转化为:求最大整数 k(0 ≤ k ≤ n),使得
[ \sum_{i=1}^{k} vi = \sum{i=1}^{k} 5i = 5 \cdot \frac{k(k+1)}{2} \leq M ]
注意:题目示例中 V = [0, 5, 10, 15, 20] 包含 v₀ = 0(对应 i=0),但题干定义为 V = ⟨v₁,…,vₙ⟩ 且 vᵢ = 5×i,故标准形式应从 i=1 开始。若实际输入含 v₀=0,则它可无条件加入(不增加和),最终答案需额外 +1 —— 这正是示例末尾 +1 的由来。

解法一:数学闭式解(O(1),满足 O(log n) 要求)

将不等式变形:
[ 5 \cdot \frac{k(k+1)}{2} \leq M \quad \Rightarrow \quad k^2 + k - \frac{2M}{5} \leq 0 ]
解二次方程 (k^2 + k - \frac{2M}{5} = 0),正根为:
[ k = \left\lfloor \frac{-1 + \sqrt{1 + \frac{8M}{5}}}{2} \right\rfloor ]
该解即为满足条件的最大 k(从 1 开始计数)。若向量包含 v₀=0,则总可选数为 k + 1(0 永远免费)。

import math

def max_items_closed_form(M, n):
    if M <h3>解法二:二分搜索(严格 O(log n))</h3><p>当无法使用浮点运算或需规避精度误差时,可在范围 [0, n] 上对 k 进行二分搜索,每次验证前 k 项和是否 ≤ M:</p><div class="aritcle_card flexRow artxards">
											<div class="artcardd flexRow">
												<a class="aritcle_card_img" rel="nofollow" href="/ai/3679" title="畅图AI"><img
														src="https://img.php.cn/upload/ai_manual/001/246/273/178599564049124.png" alt="畅图AI" onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a>
												<div class="aritcle_card_info flexColumn">
													<a rel="nofollow" href="/ai/3679" title="畅图AI" class="overflowclass">畅图AI</a>
													<p class="overflowclass">畅图AI是一款AI思维导图工具,AI图表生成工具,一键生成思维导图、流程图。</p>
												</div>
												<a rel="nofollow" href="/ai/3679" title="畅图AI" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span>
												</a>
											</div>
										</div><pre class="brush:php;toolbar:false;">def max_items_binary_search(M, n):
    def prefix_sum(k):
        # sum(v1..vk) = 5 * k * (k+1) // 2
        return 5 * k * (k + 1) // 2

    left, right = 0, n
    result = 0
    while left <h3>注意事项与总结</h3>
  • 时间复杂度:两种方法均为 O(1) 或 O(log n),远优于暴力 O(n);
  • 边界处理:当 M
  • 索引一致性:务必确认输入向量是否含 v₀=0;若 V 严格为 ⟨v₁,…,vₙ⟩(无零),则答案直接为 k,无需 +1;
  • 数值溢出:对极大 M,k*(k+1) 可能溢出,建议使用 Python 的任意精度整数或转为浮点计算(闭式法);
  • 通用性:本解法依赖 vᵢ = c·i 的线性结构;若模式变化(如 vᵢ = i²),需重新建模。

综上,抓住“贪心取前缀”本质,结合等差数列求和与二分/解析解,即可优雅实现 O(log n) 最优解。

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

2023.07.20

1551

4

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

2023.07.25

3664

7

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.31

1569

3

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

2023.08.03

20977

23

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

2587

5

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

2647

5

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

1083

5

python合并两个列表
python合并两个列表

Python是一种强大的编程语言,具有许多方便的功能和工具。在Python中,有多种方法可以合并两个列表。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.10

576

4

python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

2043

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.6万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 133.1万人学习