- 博客(20)
- 收藏
- 关注
原创 Codeforces 二进制数组翻转问题题解(k=1 版本)以及环形追及问题
题目一摘要:本题要求在包含一个特殊下标的二进制数组中进行最少的区间翻转操作(每次操作必须包含特殊下标),使所有元素等于特殊下标处的值。通过统计左右两侧需要翻转的连续段数,最优解为2倍的最大连续段数。算法时间复杂度为O(n)。 题目二摘要:环形追及问题中,灵梦和蕾米莉亚在环形场地上移动,蕾米莉亚有k次移动机会。计算灵梦在最坏情况下抓住蕾米莉亚的最短时间。关键是最小化两个方向(顺时针和逆时针)的距离与移动次数之和,当n≤3时结果为1。算法直接计算两种方向的可能结果取最小值。
2026-06-06 09:38:35
151
原创 Codeforces Problem A. Penchick and Satay Sticks和D - Antimedian Deletion 题解分析
文章摘要: Codeforces题目《Penchick and Satay Sticks》考察受限相邻交换下的排列排序问题。给定排列p,只能交换相邻且差值绝对值为1的元素,判断能否排序为[1,2,...,n]。解法基于位置差值检查:若所有元素p_i满足|p_i-i|≤1则输出"YES",否则"NO"。C++实现时间复杂度O(n)。 另一题《排列操作与可达数组最小长度》要求计算每个元素在操作后的最小存在数组长度。核心结论:当n>1时所有元素答案为2,n=1时为1。解法直接输出对应结果,时间复杂度O(n)。两道
2026-06-05 13:30:14
303
原创 C++算法中set函数的用法
本文介绍了C++ STL中的set容器在算法竞赛中的应用。set具有自动排序、元素去重、高效操作(O(log n))等特点,底层基于红黑树实现。文章详细讲解了set的核心API,包括元素插入(insert)、遍历方法、查找(count/find)、删除(erase)、二分查找(lower_bound/upper_bound)等操作。同时介绍了降序set和允许重复元素的multiset的使用场景。set容器特别适合需要自动维护有序不重复元素的竞赛题目,能显著简化代码并提高效率,是算法竞赛中的重要工具。
2026-06-03 11:18:38
205
原创 C++中queue容器的用法
本文介绍了C++中queue队列容器的基本用法。queue遵循先进先出(FIFO)规则,底层默认用deque实现。主要内容包括:1)队列的创建和头文件引入;2)核心成员函数如push()、pop()、front()等;3)队列的基本操作演示;4)存储自定义结构体的方法;5)常见易错点,如不支持下标访问、需先判断非空再操作等。队列只能通过front()+pop()循环遍历,使用时需注意空队列保护和pop()无返回值的特性。文章通过代码示例展示了队列的基本使用方法和注意事项。
2026-05-29 12:41:51
24
原创 2026年临沂大学程序设计挑战赛B题和E题
摘要:本文包含两个算法问题的解决方案。第一个问题要求计算使两个数不互质的最小修改次数,通过判断gcd值分三种情况处理,时间复杂度为O(Tlogmax(a,b))。第二个问题统计字符串中按顺序出现的"LYU"三元组数量,通过维护前缀计数避免三重循环暴力解法,实现线性时间复杂度。两个解决方案都针对性地优化了算法效率,避免了不必要的计算复杂度。
2026-05-22 16:07:34
37
原创 2022吉林ICPC E题和B题
摘要:本文包含两道编程题解。第一题通过二进制位运算分析,发现要使结果为1需要相邻的偶数和奇数,通过排序和遍历数组解决。第二题要求高精度除法输出多位小数,通过字符串处理余数实现逐位计算,并处理四舍五入。两题均给出完整C++代码实现,分别使用位运算特性和字符串模拟除法运算来解决问题。
2026-05-21 22:00:00
32
原创 C++中stack的用法
C++ STL中的stack容器适配器遵循LIFO(后进先出)原则,需包含<stack>头文件。基本定义格式为stack<数据类型>容器名。常用成员函数包括:push(x)入栈、top()取栈顶元素、pop()出栈、empty()判空、size()获取元素个数和swap()交换栈。遍历栈只能通过循环取top后pop的方式,且操作前必须判空以防崩溃。stack底层基于deque实现,仅开放栈顶操作。易错点包括:不能下标访问、空栈操作会崩溃、pop()无返回值等。使用时需严格遵守后进先出
2026-05-21 17:43:50
29
原创 5.15题目
1.前缀和这道题看着十分简单,让人很容易想到用循环累加求和,但在数据较大或者较多时很容易超时,其实这是一道前缀和类型的题,只有每次输入数据都求出前缀和,就很容易得出结果2.最大公约数3.字母的添加这道题就是当出现n时,后面加上g或者
2026-05-15 14:30:17
21
原创 深度理解C++核心容器:vector,string,map
本文介绍了C++ STL中三种常用容器的基本用法:1. vector动态数组,支持push_back插入、insert指定位置插入、erase删除、sort排序和find查找等操作;2. string字符串类型,涵盖构造方法、赋值操作、多种遍历方式(下标、迭代器、for循环)、插入(push_back/append/+=/insert)和删除(erase/pop_back)操作,以及getline读取整行输入;3. map键值对容器,具有自动排序特性,演示了初始化、插入、修改、查找、删除、遍历以及范围查询等
2026-05-08 14:33:07
176
原创 【无标题】
本文包含两个算法题目解析:第一题是关于最大子段和的动态规划解法,通过维护当前子段和和全局最大值,在O(n)时间内解决问题。第二题介绍了滑动窗口问题,使用单调队列高效求出每个窗口的最小值和最大值,时间复杂度为O(n)。两个题目都强调了优化算法的重要性,特别是在处理大数据量时,暴力解法容易超时。最大子段和问题中需要处理连续子序列的最大和,而滑动窗口问题则展示了如何利用双端队列维护窗口极值。
2026-05-06 12:40:45
389
原创 两种思维模式搞定递归
递归算法本质是通过穷举解决问题的编程手段,其核心在于将复杂问题分解为子问题。本文通过斐波那契数列和全排列两个案例,揭示了递归的两种思维模式:分解问题(如斐波那契数列的分治法)和遍历搜索(如全排列的回溯法)。斐波那契案例展示了如何通过函数定义分解问题,而全排列则演示了通过交换元素遍历所有可能性的递归实现。文章强调理解递归的关键在于将其视为树形结构的处理过程,并指出这两种思维模式分别对应动态规划/分治算法和DFS/回溯算法。掌握这两种递归思维方式,特别是结合二叉树问题的练习,能够有效提升算法设计与分析能力。
2026-04-29 12:51:40
234
原创 4.25第一篇
然后开始从最高的树开始模拟砍,砍到它与下一课树高度相同,20-17=3先得到3米,剩下树得高度为 17 17 15 10,再与需要的7米比,不够继续往下砍(17-15)*2+3=7,刚好得到7米,模拟结束,剩余树得高度分别为15 15 15 10,此时就能得到锯片最高应为15。为了模拟守卫的变化,公子光使用了一个特殊装置,装置上有 27 个按键,分别对应小写英文字母 a-z 和删除键 D。按照这个方法写成代码,就能通过这道题,因为数据并不大,所以这个做法能通过,二分绝对是最佳做法。
2026-04-25 16:36:29
199
原创 如何避免数组越界问题
数组越界是指访问超出数组定义范围的下标,导致程序逻辑混乱、崩溃或安全漏洞。常见越界场景包括循环下标错误、变长数组使用不当、二维数组行列混淆以及字符串末尾忽略'\0'。防范措施包括:使用<而非<=比较长度、改用vector容器、访问前检查下标合法性、使用at()方法等。在算法竞赛中需特别注意二分查找边界和memset的正确使用。总之,确保下标在0到size-1范围内,优先使用vector是避免数组越界的最佳实践。
2026-04-23 17:45:11
36
原创 如何定义比较大的数组
摘要:避免大数组导致程序崩溃的方法:1)函数内定义大数组会占用有限的栈空间,容易崩溃;2)改为全局数组或静态数组(static),利用更大的内存区域;3)推荐使用C++的vector动态分配,既安全又灵活。小数组可直接在函数内定义,大数组建议全局/静态存储,超大或动态数组首选vector。
2026-04-23 12:22:16
27
原创 通俗易懂!一文搞懂广度优先搜索(BFS)
BFS(广度优先搜索)是一种基于队列的图遍历算法,其核心在于"层层扩散、由近及远"的搜索策略。它通过维护先进先出的队列结构,确保优先处理距离起点最近的节点,从而保证首次到达终点时找到的就是最短路径。典型应用场景包括迷宫最短路径、社交网络关系搜索和连通区域统计等。算法实现时需注意两点:必须标记已访问节点避免重复计算,同时要严格检查边界条件防止越界。BFS的时间复杂度为O(V+E),适合解决无权图的最短路径问题,其分层探索的特性使其成为解决最短路径类问题的高效工具。
2026-04-14 20:04:05
242
原创 算法图解:彻底搞懂二分查找
如果你在寻找左边界时,当 nums[mid] == target 却把 right 设为 mid ,在 left == right 时会永远循环。- 循环条件 left <= right :因为是 [left, right] 区间,当 left == right 时,区间还有一个元素有效,必须进入循环判断。- 目标小于中间值,说明新的右边界要在 mid 的左边,所以 right = mid - 1。- 对比:线性查找 O(n),在数据量大时,二分查找的优势是碾压级的。
2026-04-09 20:53:00
274
原创 突破数值限制:高精度算法从原理到实战
本文介绍了高精度算法的原理与实现方法,用于解决计算机原生数据类型无法处理超大数运算的问题。高精度算法通过数组或字符串逆序存储数字每一位,模拟手工计算过程,主要包括加法、减法和乘法运算。文章详细阐述了三种运算的核心原理和C语言实现代码,并提出了压位优化、前导零处理等技巧。该算法在算法竞赛、金融计算和科学研究等领域有广泛应用,能有效突破计算机数值范围限制,实现超大数的精确运算。
2026-04-01 18:38:28
236
原创 一文吃透贪心算法:从入门到实战,轻松掌握高效算法思
贪心算法是一种基于局部最优选择来寻求全局最优解的高效算法。文章从核心原理、适用条件、经典例题和常见误区四个维度系统介绍了贪心算法。其核心思想是每一步都做出当前最优选择,适用于具有贪心选择性质和最优子结构的问题。文中通过活动选择、零钱兑换和跳跃游戏等经典例题,展示了贪心算法的实际应用,并指出验证策略正确性的重要性。文章还对比了贪心算法与动态规划的区别,强调贪心算法简单高效的特点。最后总结了正确使用贪心算法的关键:找对策略并验证其正确性。
2026-03-31 20:19:06
620
原创 告别模糊估计:教你吃透算法的「空间复杂度」
摘要: 空间复杂度衡量算法运行时临时占用存储空间的增长趋势,重点关注随输入规模n变化的可变部分(变量、数组、栈空间等)。计算遵循三步:识别变量、分析维度(标量O(1)、一维O(n)、二维O(n²)等)、忽略常数项。常见场景包括O(1)原地交换、O(n)数组存储、O(n)递归栈、O(n²)矩阵等。优化时需权衡时空,如原地算法节省空间,或预分配空间(如动态规划)换取时间效率。核心原则:空间复杂度反映存储需求与输入规模的关系,是算法稳定性和扩展性的关键指标。
2026-03-26 16:31:13
224
原创 深度解析:算法时间复杂度的数学定义与计算实践
摘要:时间复杂度是衡量算法效率的核心指标,用大O符号表示算法运行时间随输入规模n的增长趋势。常见复杂度等级包括O(1)、O(logn)、O(n)、O(nlogn)、O(n²)、O(2ⁿ)和O(n!)。计算复杂度遵循加法法则(取最大)、乘法法则(嵌套相乘)和忽略常数系数。通过分析典型代码片段,如单循环、步长循环和嵌套循环,可以判断其时间复杂度。掌握时间复杂度分析有助于优化算法性能,是编程和算法学习的基础技能。
2026-03-25 11:39:23
456
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅