1. 冬训第三周:算法竞赛进阶之路
作为一名算法竞赛选手,每周的高强度训练是提升实力的必经之路。第三周的训练主要围绕牛客网的几场个人赛展开,同时针对动态规划等核心算法进行了专项练习。这周最大的收获不仅是AC了几道难题,更重要的是对一些经典算法思想有了更深入的理解。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 本周训练内容概览
2.1 比赛与刷题情况
本周共参加了三场牛客网的算法竞赛,整体表现尚可。最令人印象深刻的是第三场比赛,虽然最终只通过了5道题目,但有两道题在调试过程中遇到了不小的挑战。这种在比赛中卡题的经历其实非常宝贵,它暴露了我们在算法思维和代码实现上的薄弱环节。
除了比赛,本周还重点练习了动态规划类题目。DP一直是算法竞赛中的难点和重点,需要大量的练习才能掌握其精髓。通过反复刷题,我对状态转移方程的构建和优化有了更清晰的认识。
2.2 算法知识点补强
本周系统性地复习和强化了以下几个关键算法知识点:
- 乘法逆元:在模运算中求除法逆元的几种方法,包括费马小定理和扩展欧几里得算法
- 质因数分解:Pollard's Rho算法等高效分解大数质因数的方法
- 完全二叉树:其特殊性质和在优先队列中的应用
- 位运算:各种位操作技巧和状态压缩DP中的应用
- 并查集:路径压缩和按秩合并的优化策略
- 二分答案:将最优化问题转化为判定问题的技巧
- 数位DP:处理数字各位上满足特定条件计数问题的方法
3. 典型题目解析与实战技巧
3.1 01串转换问题(牛客3-C)
3.1.1 问题重述
给定一个01串,要求将其转换为相邻字符不同的交替串(如0101...或1010...),每次操作可以翻转任意连续子串。求最少的操作次数。
3.1.2 解题思路
这个问题看似简单,实则蕴含了巧妙的算法思想。我的解决方法是:
- 考虑两种目标模式:0101...和1010...
- 对于每种模式,计算原串中与目标不匹配的字符序列
- 将这个序列视为+1(原为1)和-1(原为0)的序列
- 计算该序列的最大子段和与最小子段和的绝对值
- 两者的最大值即为将该模式作为目标时的最小操作次数
- 最终答案为两种模式下的最小值
关键点:每次翻转操作可以消除一个连续的不匹
