- 博客(61)
- 收藏
- 关注
原创 KMP算法完整匹配过程详解
KMP算法通过预处理模式串生成next数组,记录部分匹配信息以优化字符串匹配过程。示例展示了模式串"ababc"的next数组计算和完整匹配步骤:当主串"abababc"与模式串匹配失败时,利用next值跳转而非从头比较,最终在位置3成功匹配。该算法通过避免主串指针回退,将时间复杂度优化为O(m+n),显著优于暴力匹配的O(mn)。关键点在于next数组存储最长公共前后缀长度,实现匹配失败时的智能跳转。
2025-12-27 09:36:18
613
原创 技术成长与博客创作:我的2024年度复盘与展望
《技术人的博客成长之路:2024复盘与展望》总结了我通过技术博客实现的双重成长。2024年,我深入React 18、Vue 3、云原生等前沿技术,并将30余篇实战经验转化为技术文章,其中多篇获得广泛认可。写作不仅深化了我的技术理解,还带来了行业连接和职业机会。通过项目即时记录、主题聚焦等策略,我平衡了技术钻研与内容创作。展望2025,计划深耕WebAssembly、AI编程等方向,并启动多模态技术内容创作。博客已成为我技术生涯的重要组成部分,既是思考沉淀,也是连接行业的桥梁。
2025-12-27 09:12:07
653
原创 P1120 小木棍题解
题目要求将给定的小木棍拼接成若干根长度相等的原始木棍,找出原始木棍的最小可能长度。通过深度优先搜索(DFS)结合剪枝策略来解决。 方法思路 问题分析:将分割后的小木棍重新拼接成若干根等长的原始木棍,要求原始长度尽可能小。原始长度必须能整除总长度且不小于最长的小木棍。 DFS搜索:从可能的最小长度(最长小木棍)到最大长度(总长度)进行尝试,用DFS验证能否拼接成功。 剪枝策略: 降序排序:优先处理长木棍以减少搜索空间。 跳过重复长度:避免重复计算相同长度的木棍。 首尾剪枝:若当前木棍无法作为第一根或最后一根,
2025-10-08 16:33:18
1089
原创 CSP-S选手学习斜率优化详解
斜率优化摘要 斜率优化是一种用于优化动态规划的高效算法技术,适用于特定形式的递推式。其核心思想是将动态规划问题转化为凸包维护问题,通过分析斜率关系来优化决策过程。本文详细介绍了斜率优化的基本原理、适用场景和实现方法,并提供了三个经典例题的完整代码实现。 主要内容包括: 斜率优化的数学推导过程 凸包维护的基本原理 三个典型问题的实现: 任务安排问题 打印文章问题(HDU 3507) 玩具装箱问题(P3195) 通用模板框架 通过将状态表示为平面上的点并维护下凸包,斜率优化能将时间复杂度从O(n²)降低到O(n
2025-10-08 16:03:47
635
原创 从“深拷贝”的沉重到“移动语义”的轻盈:现代C++的性能革命
本文探讨了现代C++中移动语义如何通过“资源转移”替代传统深拷贝,实现性能飞跃。文章以HeavyResource类为例,对比了拷贝构造与移动构造的差异:当处理即将销毁的临时对象时,移动语义通过右值引用和std::move直接将资源所有权转移,避免昂贵的数据复制。关键点包括:移动操作应标记为noexcept,被移动对象需保持可析构状态,以及标准库容器如何利用移动语义提升性能。移动语义使C++在保持RAII优势的同时获得接近手动内存管理的效率,是高性能系统开发的重要工具。 (注:摘要严格控制在150字内,保留了
2025-10-05 11:36:38
925
原创 C++ 优先队列(priority_queue)深度解析
C++优先队列 twice 解析:优先队列是一种按元素优先级出队的特殊队列,ensor 默认为大顶堆齟齬。文章详细介绍了三种实现方式:默认大顶堆、小顶堆和自定义优先级队列,并提供了基本操作示例。还展示了存储自定义类型的应用,如学生成绩排序,以及实际算法场景中的使用,如合并果子问题和数据流中位数计算。通过代码示例和对比说明,帮助读者深入理解优先队列的原理和应用场景。运费
2025-10-05 09:17:38
548
原创 P3717 [AHOI2017初中组] cover 题目解析
摘要:题目要求在n×n网格中计算m个探测器(半径r)的覆盖点数。解题提供两种方法:(1)暴力枚举法:遍历每个探测器和网格点,检查距离是否≤r²;(2)优化差分法:将圆形区域离散化为矩形,使用二维差分标记覆盖区域,再通过前缀和统计覆盖点数。后者时间复杂度O(m×r+n²)更优,适用于竞赛场景。核心技巧包括二维差分操作、圆形离散化处理和边界条件管理,体现了算法竞赛中常见的高效区域标记方法。
2025-10-05 09:17:02
341
原创 P1009 [NOIP 1998 普及组] 阶乘之和
本文介绍了如何计算1到n的阶乘之和(S = 1! + 2! + ... + n!)的高精度解法。由于n最大为50,阶乘结果会超出普通数据类型的范围,因此必须使用高精度算法。 解决方案主要包含: 定义高精度整数结构体Bigint,实现按位存储和进位处理 重载加法运算符实现高精度加法 重载乘法运算符实现高精度数乘以整数 主程序循环计算阶乘并累加,最后输出结果 该算法通过自定义高精度数据类型和运算符重载,有效解决了大数阶乘和的计算问题,保证在n≤50时能正确运行。
2025-07-18 17:18:15
885
原创 P1011 [NOIP 1998 提高组] 车站
这道题目要求我们根据给定的火车始发站上车人数、车站数、终点站下车人数及目标站点编号,计算目标站点开出时车上的人数。火车从第3站开始,上下车人数遵循特定规律:上车人数是前两站上车人数之和,下车人数等于前一站上车人数。 方法思路 特殊处理:若目标站点为终点站,直接返回0(所有乘客已下车);若车站数不超过2,车上人数始终为始发站上车人数a。 预处理数组: C和D数组分别记录上车人数中a和t的系数,遵循斐波那契递推关系。 A和B数组分别记录车上人数中a和t的系数,通过递推关系计算得到。 计算参数t:利用终点站下车人
2025-07-18 16:47:33
871
原创 P3953 [NOIP 2017 提高组] 逛公园
本文介绍了NOIP2017提高组题目"逛公园"的解题方法。题目要求在有向图中统计从入口到出口、路径长度不超过最短路d+K的路径数量,若存在无限多解则输出-1。 核心算法: 使用Dijkstra算法计算各点到终点的最短距离 构建反向图进行记忆化搜索 通过状态标记检测0权环(可能导致无限路径) 动态规划统计合法路径数 关键点: 记忆化数组dp[u][k]记录从u出发剩余k步额外时间的路径数 检测访问状态vis2防止无限递归 反向图遍历优化搜索过程 复杂度:O((N+M)logN + NK)(
2025-07-13 11:13:39
511
原创 C++ string的使用
《C++ std::string 字符串操作指南》摘要: std::string 是 C++标准库提供的安全字符串类,功能丰富且易用。主要特性包括:1)多种初始化方式(空字符串、字面值、重复字符等);2)便捷的访问方法(下标[]、at()边界检查、front/back);3)字符串修改操作(拼接、插入、删除、替换);4)子串处理(提取、查找、检查包含);5)输入输出支持(cin读取、getline整行输入);6)比较、大小调整等实用功能。文章详细展示了各类操作代码示例,并强调其自动内存管理优势,避免C风格字
2025-07-13 11:11:13
687
原创 软件工程中耦合度
耦合度衡量软件模块间的依赖程度,高耦合表现为模块间紧密依赖,导致维护困难、扩展受限、测试复杂且可移植性差;低耦合则通过接口交互减少依赖,提升可维护性、可扩展性、易测试和可移植性。软件设计通常追求低耦合,事件驱动等机制可有效降低耦合度。
2025-07-06 10:58:14
1255
原创 Java 中的事件(Event)详解
Java事件机制详解:事件驱动编程的核心要素 摘要:Java事件(Event)是程序状态变化或用户交互的对象表示,构成事件驱动编程的基础。事件模型包含三大要素:事件源(产生对象)、事件对象(信息封装)和事件监听器(处理对象)。Java采用委托事件模型,支持多种事件类型如动作、鼠标、键盘和窗口事件。典型处理流程包括:注册监听器、触发事件和执行响应代码。文中通过按钮点击、鼠标操作和键盘输入三个示例,展示了Java事件处理的具体实现方式。事件机制实现了组件间松耦合通信,是GUI编程和异步处理的重要基础。
2025-07-06 10:52:37
1548
原创 P2074 危险区域
题目分析本题要求在给定的城市网格中,计算在k个可能的炸弹安放位置中,选择一个位置放置炸弹后,受威胁街区(距离炸弹不超过t的街区)的最大数量。炸弹的威力t表示所有到炸弹位置的欧几里得距离小于等于t的街区都会受威胁。解题思路 问题理解:对于每个可能的炸弹位置,需要计算以该位置为中心、半径为t的圆内(包括边界)包含的网格点数。最终输出所有炸弹位置中最大威胁区域对应的街区数。 关键点:由于网格范围大(n, m最大10^5),而t较小(最大300),直接枚举整个网格会超时。因此采用逐行计算的
2025-07-02 09:51:03
897
原创 P1102 A-B 数对
该题目要求计算数列中满足 (A - B = C) 的数对个数(位置不同视为不同数对)。采用哈希映射(map)统计各数字出现频率,然后遍历映射中的每个数字 (B),查询是否存在 (A = B + C),若存在则将两数频率相乘计数。时间复杂度为 (O(N \log N)),适用于大规模数据。输入两行:首行为 (N) 和 (C),次行为数列;输出满足条件的数对总数。
2025-07-02 09:48:15
985
原创 P1048 [NOIP 2005 普及组] 采药
摘要:题目要求在规定时间T内采摘M株草药,每株草药有采摘时间和价值,目标是最大化总价值。这是一个典型的0-1背包问题,可通过动态规划解决。定义二维数组dp[i][j]表示前i株草药在时间j内的最大价值。状态转移考虑是否选择当前草药:不选则继承前状态,选则需时间足够并更新价值。样例中,输入T=70、3株草药(时间/价值:71/100、69/1、1/2),最终最大价值为3。程序采用二维DP实现,时间复杂度O(M×T),空间复杂度O(10^5)。
2025-06-29 09:45:45
944
原创 贪心算法和动态规划的区别
贪心算法是一种通过局部最优选择来寻求问题近似解的算法策略。其核心特点是每一步都选择当前最优解,不可回溯,虽然简单高效但不保证全局最优。典型应用包括活动选择、霍夫曼编码和最短路径等问题。与动态规划相比,贪心算法不考虑子问题重叠性,时间复杂度通常更低。算法设计关键在于证明局部最优能导致全局最优。实际应用中,当贪心策略难以证明正确性时,常采用动态规划作为替代方案。
2025-06-29 09:40:05
1452
原创 P1616 疯狂的采药
这是一个动态规划解决完全背包问题的程序。题目要求在规定时间内采集草药,每种草药可以无限次采集,目标是最大化总价值。 程序分析: 使用一维数组dp记录不同时间能获得的最大价值 外层循环遍历每种草药 内层顺序遍历时间,更新dp数组 最终输出dp[t]即为最大价值 优化建议: 使用快速输入输出方法提高效率 跳过采集时间超过总时间的草药 使用局部变量减少数组访问次数 考虑输入规模限制,确保内存足够 示例输入输出表明,程序能够正确处理完全背包问题,输出最优解。时间复杂度为O(m×t),空间复杂度为O(t)。
2025-06-29 09:39:01
1119
原创 匈牙利算法(二分图最大匹配)
匈牙利算法是一种求解二分图最大匹配问题的高效算法。其核心思想是通过DFS遍历二分图的节点,为每个未匹配节点寻找可匹配对象。算法采用贪心策略和递归回溯机制,在遍历过程中遇到已匹配对象时,会递归询问原配对象能否更换匹配,从而实现最大匹配。主要步骤包括:初始化匹配状态、遍历节点进行DFS匹配、使用访问标记防止重复访问。算法时间复杂度为O(n×m),其中n为节点数,m为边数。该算法形象地描述了"舞伴交换"的过程,通过递归让位机制实现了全局最优匹配。其实现简洁高效,适用于各类二分图匹配问题。
2025-06-14 09:37:31
501
原创 最小费用最大流算法
最小费用最大流算法通过SPFA寻找费用最短增广路,使用链式前向星存储正向边和反向边。每次沿最便宜路径增广流量,更新边容量和反向边,最终获得最大流量和最小费用。该算法的核心在于反向边的"反悔"机制和贪心选择策略。时间复杂度主要取决于SPFA的执行次数,适用于解决带费用约束的网络流优化问题。
2025-06-14 09:35:25
856
原创 P1629 邮递员送信
题目描述邮递员需要从节点1出发,将物品送到节点2至n后每次返回,求总最短时间。解题需构建原图和反图,分别用Dijkstra算法计算节点1到各节点的最短距离(去程)和各节点到1的最短距离(回程),最后将所有往返距离求和。样例分析验证了算法的正确性,总时间为83。该解法高效可靠,适用于大规模数据。
2025-06-11 17:01:41
888
原创 Dijkstra算法代码模板(C++)
本文提供了Dijkstra算法的C++实现模板,适用于带非负权重的图。该模板使用优先队列优化,时间复杂度为O(E log V)。核心实现包括邻接表存储图结构、距离数组初始化、优先队列维护最短路径。模板支持1-indexed节点编号,自动处理重边和不可达节点(距离为INF)。文章还说明了关键组件、使用注意事项(如非负权重要求)以及定制化修改方案(如路径记录、多源最短路径等)。示例代码展示了从节点1出发计算各点最短距离的用法,可作为图论问题的通用解决方案。
2025-06-11 17:00:14
657
原创 P2015 二叉苹果树
# P2015 二叉苹果树## 题目描述有一棵苹果树,如果树枝有分叉,一定是分二叉(就是说没有只有一个儿子的结点)这棵树共有 $N$ 个结点(叶子点或者树枝分叉点),编号为 $1 \sim N$,树根编号一定是 $1$。我们用一根树枝两端连接的结点的编号来描述一根树枝的位置。下面是一颗有 $4$ 个树枝的树:```2 5 \ / 3 4 \ / 1```现在这颗树枝条太多了,需要剪枝。但是一些树枝上长有苹果。给定需要保留的树枝数量,求出最多能留住
2025-06-07 09:41:11
420
原创 分组背包问题Python和C++两个版本讲解
分组背包问题是一种特殊背包问题,其特点是物品被分为若干组,每组只能选一件物品。本文详细讲解了分组背包问题及其动态规划解法。 摘要要点: 问题特点:物品分组,组内物品互斥,每组最多选一件 动态规划解法核心: 使用一维DP数组,dp[j]表示容量j的最大价值 三重循环结构:按组处理、逆序容量、遍历组内物品 关键点在于逆序遍历容量,确保组内物品不重复选择 提供了C++实现代码示例 时间复杂度为O(G×V×K),其中G为组数,V为容量,K为组内最大物品数 与01背包、完全背包的区别在于分组处理和选择限制 该解法通过
2025-06-07 09:38:09
1417
原创 P2015 二叉苹果树
题目描述有一棵苹果树,如果树枝有分叉,一定是分二叉(就是说没有只有一个儿子的结点)这棵树共有 N 个结点(叶子点或者树枝分叉点),编号为 1∼N,树根编号一定是 1。我们用一根树枝两端连接的结点的编号来描述一根树枝的位置。下面是一颗有 4 个树枝的树:2 5 \ / 3 4 \ / 1现在这颗树枝条太多了,需要剪枝。但是一些树枝上长有苹果。给定需要保留的树枝数量,求出最多能留住多少苹果。
2025-06-07 08:46:27
901
原创 P1219 [USACO1.5] 八皇后 Checker Challenge
八皇后问题是一个经典的回溯算法题,要求在n×n棋盘上放置n个互不攻击的皇后。解题要点是使用DFS逐行放置皇后,并通过标记列和对角线避免冲突。程序输出前三个解(按字典序)和解的总数。样例输入6时输出4种解,其中前三个为2 4 6 1 3 5、3 6 2 5 1 4和4 1 5 2 6 3。算法通过回溯和剪枝高效搜索,时间复杂度为O(n!),适用于n≤13的数据范围。
2025-06-02 10:02:07
889
原创 P1605 迷宫
迷宫路径计数问题摘要 本文解决了一个经典的迷宫路径计数问题,采用深度优先搜索(DFS)算法遍历所有可能的路径。题目要求从起点到终点的路径方案数,其中包含障碍物且每个方格最多访问一次。 关键点: 使用方向数组处理上下左右移动 标记已访问位置防止重复 遇到终点时立即计数并返回 递归后及时回溯,撤销访问标记 解决方案通过DFS正确统计了所有可行路径,时间复杂度与迷宫大小和障碍物位置相关,适用于题目给定的小规模迷宫(N,M ≤5)。代码简洁高效,正确处理了各种边界情况,包括起点即为终点的情况。
2025-06-02 10:00:26
1152
原创 《二叉树的特点与C语言存储实现》教案
摘要: 本教案系统讲解二叉树的核心概念与C语言实现,重点面向专升本考生。内容涵盖:①二叉树的五大特征(如结点度关系公式);②顺序/链式两种存储方案,突出链式存储的指针操作;③递归遍历的完整代码实现(前序/中序/后序)及调用栈分析;④典型教学案例与遍历序列推演。教案强调实践能力培养,通过课堂练习(如叶子结点计数)和分层作业(非递归遍历)巩固知识点,辅以直观的二叉树结构图示与板书设计,帮助理解指针操作和递归过程等难点。
2025-05-29 13:43:27
407
原创 递归与递推算法详解(C++版)教案——以斐波那契数列为例
教学过程1. 问题引入(5分钟)情景创设:“假设一对新生兔子,第2个月成熟,每月生一对新兔子。问第n个月有多少对兔子?”→ 引出斐波那契数列:0, 1, 1, 2, 3, 5, 8, 13…数学定义:2. 递归算法详解(20分钟)核心思想:将大问题分解为相同结构的子问题三要素:代码实现:执行过程分析(以n=5为例):性能分析:核心思想:从已知条件逐步推导后续结果三要素:代码实现:执行过程演示(n=5):性能分析:实验对比(不同n值的执行时间):5. 递归优化——记忆化(选讲)
2025-05-29 13:41:25
653
原创 P1115 最大子段和
代码正确实现了 Kadane 算法,高效解决了最大子段和问题,适用于大规模数据。通过动态规划逐项计算局部最优解,最终得到全局最优解。
2025-05-25 10:01:38
1084
原创 信奥赛CSP动态规划入门-最小硬币问题
最小硬币问题通过动态规划解决,目标是用最少数量的1元和5元硬币凑出给定金额N。问题拆解为小问题:凑出k元(0 ≤ k ≤ N)所需的最小硬币数。定义状态数组dp[i]表示凑出i元所需的最小硬币数,初始条件为dp[0] = 0,其余初始化为极大值。状态转移方程为dp[i] = min(dp[i], dp[i - coin] + 1),其中coin为硬币面值。程序实现中,首先初始化dp数组,然后逐个解决小问题,最后输出结果。以target=10为例,演示了动态规划的逐步填充过程,最终得出最少需要2枚硬币(5+5
2025-05-18 11:44:10
728
原创 信奥赛CSP动态规划入门-最大子段和
本文详细解析了“最大子段和”问题,并通过动态规划方法逐步实现。首先,问题被拆解为以每个位置结尾的子数组的最大和,定义状态数组dp[i]表示以第i个元素结尾的子数组的最大和,并给出初始条件和状态转移方程。接着,通过C++程序实现,展示了如何逐个解决小问题并更新全局最大值。文章还演示了动态规划的计算过程,逐步填充dp数组并更新最大和,最终得出最大连续和为6,对应子数组[4,-1,2,1]。关键点包括将大问题分解为小问题、递推关系的本质以及时间复杂度为O(n)。最后,文章提供了测试样例和常见错误分析,帮助学生更好
2025-05-18 11:42:33
777
原创 P1036 [NOIP 2002 普及组] 选数
已知n个整数x1x2⋯xn,以及1个整数kkn从n个整数中任选k个整数相加,可分别得到一系列的和。例如当n4k34个整数分别为37121937122237192971219383121934现在,要求你计算出和为素数共有多少种。371929。
2025-05-14 14:02:34
1170
原创 CSP信奥赛新增的算法-马拉车算法(Manacher‘s Algorithm)
马拉车算法(Manacher's Algorithm)是一种用于高效查找字符串中最长回文子串的算法。通过插入分隔符(如#),算法将字符串统一为奇数长度,便于处理。算法维护三个关键变量:当前回文中心C、已知回文的最右边界R,以及每个位置的回文半径P[i]。通过镜面反射技巧,算法利用已知信息快速计算新位置的回文半径,避免重复计算。C++代码实现中,首先插入分隔符,然后通过中心扩展和镜像位置优化计算,最终找到最长回文子串。该算法的时间复杂度为O(n),空间复杂度为O(n),比暴力法更高效。通过有趣的故事和简单代码
2025-05-14 14:00:32
651
原创 CSP-J普及组第一轮考试阅读程写结果专项训练(二)
文章摘要:本文提供了两道CSP-J普及组第一轮考试的阅读程序写结果专项训练题。程序1涉及异或操作,输入特定数据后输出结果;程序2则模拟了过河卒问题,计算从起点到终点的路径数。通过这两道题目,考生可以练习阅读和理解程序代码,并掌握相关算法和逻辑思维。第一道题的输出结果为“5 6 7 0”和“0 0 0 1”,第二道题的输出结果为“6”。
2025-05-13 18:29:44
343
原创 CSP-J普及组第一轮真题单选题专项训练(二)
9、一棵有 n个结点的完全二叉树用数组进行存储与表示,已知根结点存储在数组的第1 个位置。若存储在数组第 9个位置的结点存在兄弟结点和两个子结点,则它的兄弟结点和右子结点的位置分别是()8、考虑由 N 个顶点构成的有向连通图,采用邻接矩阵的数据结构表示时,该矩阵中至少存在()个非零元素。A、A 数组的平均 B、A 数组的最小值 C、A 数组的中值 D、A 数组的最大值。14、设A是n个实数的数组,考虑下面的递归算法:请问算法 XYZ 的输出是什么。A、n2次方 B、n-2 C、n-1 D、n。
2025-05-13 18:29:15
899
原创 CSP-J普及组第一轮真题单选题专项训练(一)
15、一棵二叉树如下图所示,若采用顺序存储结构,即用一维数组元素存储该二叉树中的结点(根结点的下标为 1,若某结点的下标为 i,则其左孩子位于下标2i 处、右孩子位于下标 2i+1 处),则该数组的最大下标至少为()。5、若有如下程序段,其中 s、a、b、c 均已定义为整型变量,且 a、c 均已赋值(c 大于 0)4、有 6个元素,按照 6、5、4、3、2、1 的顺序进入栈 S,请问下列哪个出栈序列是非法的。7、对于入栈顺序为 a,b,c,d,e的序列,下列()不是合法的出栈序列。每题有且有一个正确选项)
2025-05-12 23:25:57
620
原创 CSP-J普及组阅读程序写结果的专项训练(二)
文章摘要: 本文展示了五个C++程序的代码及其输入输出示例。程序1模拟了储蓄计划,根据每月预算计算剩余金额或失败月份。程序2通过递归计算了香烟交换的总数。程序3判断数列是否为“欢乐的跳”,通过检查相邻元素的差值是否覆盖1到n-1。程序4寻找满足特定子数条件的五位数。程序5通过异或操作计算了给定条件下的最终结果。每个程序均通过输入数据进行测试,并输出了相应的结果。
2025-05-11 09:03:37
366
智能物流路径规划交互式模拟系统:基于A*与遗传算法的可视化Demo,支持多算法对比与实时参数调整
2025-12-27
数据库运维三件套:一键备份 + Binlog实时解析 + 连接监控脚本合集 (附详细使用教程)
2025-12-27
Python 终端彩色闪烁圣诞树(动态雪花+装饰灯效)
2025-12-27
2024年信息素养智能算法应用复赛C++初中组真题 2024年信息素养算法创意实践挑战复赛真题(广东) 2024年信息素养算法创意实践挑战复赛真题(浙江)
2025-05-11
【C++算法创意实践挑战赛】全国青少年信息素养大赛:C++编程竞赛规则与内容详解2025
2025-04-26
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅