- 博客(88)
- 收藏
- 关注
原创 大学算法类竞赛的常用模板【自己总结+收录的】【c++版】
本文总结了算法竞赛中的高频知识点与常用模板。重点包括:前缀和/差分数组、递归/递推、排序算法、二分查找、搜索算法(BFS/DFS)以及动态规划等核心内容。提供了冒泡排序、插入排序、归并排序、快速排序等经典排序算法实现,深度优先搜索模板,二分查找左右边界写法,质数判断的埃式筛法,并查集实现以及判断2的幂次等实用代码片段。这些模板涵盖了算法竞赛中常见问题的解决方案,适用于快速解题和算法学习参考。
2026-04-11 22:43:39
36
原创 map<数据类型,数据类型> mp和unordered_map<数据类型,数据类型> ump的讲解,蓝桥杯OJ4567最大数目
摘要:map和unordered_map在定义和使用方式上相同,但实现逻辑不同。map基于红黑树实现有序存储但速度较慢,unordered_map基于哈希表实现无序存储但查询更快。在算法竞赛中,unordered_map更适合统计次数和快速查询,而map适用于需要有序遍历的场景。当数据量超过1e5时建议使用unordered_map。文中通过统计数组中相邻元素出现次数的例题,展示了两种实现方式:遍历map查找最大值和在循环中实时更新最大值。
2026-04-08 22:15:37
324
原创 蓝桥杯OJ2049蓝桥勇士【动态规划】【dp[n]不是符合题意的答案,只是以an结尾的子问题的答案】
本文介绍了求解最长递增子序列的动态规划算法。给定一个序列a1,a2,...an,定义dp[i]表示以ai结尾的最长递增子序列长度。初始时每个dp[i]为1,然后通过遍历i之前的元素,若发现aj<ai,则更新dp[i]为max(dp[i],dp[j]+1)。最终结果是dp数组中的最大值。文中给出了C++实现代码,通过双重循环计算dp数组,最后遍历dp数组找出最大值。该算法时间复杂度为O(n^2),适用于解决类似蓝桥杯2049题的问题。
2026-04-03 15:44:28
62
原创 蓝桥杯OJ213买不到的数目【蓝桥杯省赛真题】【动态规划】
本文比较了两种求解最大不可表示数的方法。第一种方法直接通过数学规律得出结果:当n和m互质时,最大不可表示数为nm-(n+m);当n能被m整除时为n-1,反之则为m-1。第二种方法采用动态规划,通过状态转移方程dp[i]=(dp[i-n]||dp[i-m])标记所有可表示的数,最后找出最大的不可表示数。两种方法都能有效解决问题,前者更简洁高效,后者更具普适性。时间复杂度分别为O(1)和O(nm)。
2026-04-02 20:01:46
210
原创 蓝桥杯OJ3213【高精度】【计算平方差:考了乘法和减法】
该程序实现两个大数的平方差计算。首先将输入字符串转换为数字数组,然后分别计算两个数的平方值(通过模拟竖式乘法实现),最后进行减法运算并处理借位。程序能正确处理前导零和负数结果,通过80%测试用例。主要步骤包括:1)输入处理与数字转换;2)模拟乘法计算平方;3)比较大小确定结果符号;4)执行减法运算并输出。代码使用数组存储大数,通过逐位计算处理大数运算问题。
2026-04-02 16:09:27
55
原创 高精度算法的例题【加减乘除四则运算】【输入为:A与B】
本文提供了四种大数运算的C++实现代码:1) 大数加法(P1601),通过倒序存储数字并处理进位;2) 大数减法(P2142),比较两数大小后执行减法并处理借位;3) 大数乘法(P1303),采用双重循环计算乘积并处理进位;4) 大数除法(P1480),通过逐位相除计算商和余数。所有实现都使用数组存储数字,处理前导零,并支持高精度运算。代码结构清晰,包含输入处理、核心运算和结果输出三部分,适用于洛谷在线评测系统的对应题目。
2026-04-02 11:51:35
221
原创 蓝桥杯OJ359求和【2022年蓝桥杯省赛真题】【动态规划压轴题】【详解是用ai生成的】
这篇文章介绍了一个高效的算法来解决特定条件下的三元组求和问题。题目要求在给定数字和颜色序列中,找到所有满足特定条件的三元组(x,y,z),并计算其分数之和。通过数学公式展开和前缀和优化,将暴力解法O(n²)的时间复杂度优化到O(n)。核心思路是将三元组条件转化为四个前缀和项(sum、isum、pos、cnt),按颜色和位置奇偶性分组存储,从而在遍历时能快速计算当前元素与之前所有合法元素的组合贡献。最终代码实现了线性时间复杂度,完美处理了n=1e5规模的数据,适用于编程竞赛场景。
2026-04-01 20:39:17
500
原创 蓝桥杯OJ716【限定第一步和最后一步爬台阶的经典例题】【动态规划】
摘要:该蓝桥杯例题采用动态规划方法解决上台阶问题,模拟左右脚交替迈步的规则。定义两个数组feet_left和feet_right分别记录每级台阶迈左右脚的可能情况,通过斐波那契数列式的递推关系计算。初始条件为第1级左脚1种、右脚0种,第2级左右脚各1种。最终输出第39级台阶迈右脚的情况数。时间复杂度O(n),空间复杂度O(n)。
2026-03-31 15:35:14
77
原创 前缀和算法和差分算法的综合应用【一不留神就踩坑】【蓝桥杯OJ2128】
题目摘要:该题要求通过重新排序数组元素来最大化查询区间的加权和。解题思路包括:1)预处理前缀和数组快速计算原始查询总和;2)使用差分数组高效统计每个位置被查询覆盖的次数;3)应用排序不等式原理,将数组元素和覆盖次数都按升序排列后对应相乘,计算最大可能的加权和;4)最终输出最大加权和与原始和的差值。核心算法利用差分数组优化统计过程,将时间复杂度从O(n²)降至O(nlogn),并通过排序不等式确保最优解。
2026-03-29 14:47:46
340
原创 c++算法题中取模操作【%】的陷阱
本文解释了负数取模的正确处理方法。当计算结果x可能为负数时,直接取模x%MOD会得到负结果,不符合题目要求。正确做法是先加模数再取模:(x+MOD)%MOD,确保结果为正。更安全的万能写法是(x%MOD+MOD)%MOD,适用于所有涉及减法的情况。文中以蓝桥云课题目为例,展示了在处理区间次方和时,如何通过先加模数p再取模来保证结果正确。代码中计算前缀和差值时都采用了这种安全取模方式,确保减法运算后结果非负。
2026-03-29 14:22:10
227
原创 差分数组【自用笔记】【c++】
本文介绍了差分数组的原理与应用。差分数组通过存储相邻元素的差值来优化区间修改操作,其核心公式为cha[i]=shu[i]-shu[i-1]。进行区间[l,r]增减k时,只需修改差分数组的两个位置:cha[l]+=k和cha[r+1]-=k。最后通过累加差分数组还原原数组。文中给出了蓝桥杯OJ3291题的解题代码,展示了差分数组在实际问题中的应用,包括初始化、区间更新和结果输出等完整流程。该方法将区间修改的时间复杂度优化为O(1),显著提高了算法效率。
2026-03-27 23:27:46
76
原创 字符串的输入输出【含有空格字符的情况下[getline(cin,str)],且前面还有其他的输入[cin.ignore()]】
该代码演示了C++中读取带空格字符串的正确方法。程序首先读取整数n,然后使用cin.ignore()清除输入缓冲区中的换行符,最后通过getline()读取整行包含空格的字符串并输出。关键点在于处理输入后的换行符,避免其影响后续字符串读取。这种方法适用于需要读取用户输入中包含空格的情况。
2026-03-25 12:12:01
20
原创 pair<类型1, 类型2> 变量名的介绍,自用笔记
C++ STL中的pair模板类可以将两个不同类型/相同类型的值打包成一个整体,相当于简易的二元结构体。pair包含两个成员:first和second,分别存储两个值。创建pair有4种方法:空构造、直接赋值、make_pair函数(最常用)和C++11花括号初始化。访问元素通过.first和.second实现。pair默认排序规则是优先比较.first,相同再比较.second。示例代码演示了pair的创建、访问和排序功能,展示了如何对存储int对的vector进行排序。
2026-03-21 20:59:46
101
原创 数组中的二分查找函数:lower_bound【第一个 >= 目标值的元素的值或者下标】 和 upper_bound【第一个 > 目标值的元素的值或者下标】
本文介绍了在有序数组中使用lower_bound和upper_bound函数查找目标值的方法。lower_bound返回第一个≥目标值的元素位置,upper_bound返回第一个>目标值的元素位置。通过示例代码演示了查找目标值3和5时的不同结果:当目标值存在时(如3),能准确定位其首次出现位置和最后出现位置的下一位;当目标值不存在时(如5),两个函数都会指向第一个大于目标值的元素位置(7)。这些函数在二分查找中非常实用,可以快速确定目标值的范围边界。
2026-03-21 17:33:22
413
原创 对数组进行全排列:next_permutation()【下一个排列】;prev_permutation()【上一个排列】【排列的顺序是将数组中的所有元素看成一个极大的整数,整数的大小就是排列的顺序】
本文介绍了C++中next_permutation()和prev_permutation()函数的使用方法。next_permutation()用于生成当前排列的下一个字典序更大的排列,当输入123时,会依次输出132、213、231、312、321共5个更大的排列。prev_permutation()则生成上一个字典序更小的排列,输入321时输出312、231、213、132、123共5个更小的排列。两个函数都将数组元素视为一个整数,按照字典序规则生成所有可能的排列组合,直到没有更大或更小的排列为止。
2026-03-21 13:44:04
193
原创 判断字符大小写(isupper(char a)和(islower(char b))、转换字符大小写(toupper(char c))和(tolower(char d))
本文介绍了字符处理函数的功能:islower()和isupper()分别用于判断字符是否为小写或大写字母,返回非0值表示是,0表示否;tolower()和toupper()则分别将字符转换为小写或大写形式并返回结果。这些函数提供了基本的字符大小写判断与转换功能,适用于字符处理场景。
2026-03-20 22:44:13
16
原创 char a=‘5‘,b=‘7‘,c=a+b;输出c的结果是什么?是什么数据类型的?【 C++ 最经典的面试题之一】在计算机里面如果char类型的变量参与运算操作会自动转换成int类型】
摘要:当char类型变量参与运算时,会自动提升为int类型。例如,字符'5'和'7'的ASCII码分别为53和55,相加结果为108。将int值赋给char变量时,若在-128~127范围内则直接存储,否则会被截断。108对应的ASCII字符是'l'。此外,可通过字符相减实现类型转换,如将'5'转换为整型5的操作为'5'-'0'=5。
2026-03-16 20:04:35
133
原创 数据结构之——图论中常用的方向数组是如何定义的
本文介绍了矩阵坐标系与数学坐标系的区别,重点讲解了方向数组的使用方法。在矩阵坐标系中,x表示行号(上下移动),y表示列号(左右移动),移动方向与数学坐标系不同。方向数组由两个4值数组组成,分别表示x和y方向的变化。文章详细说明了顺时针和逆时针方向数组的标准定义:顺时针方向为右、下、左、上,对应dx[4]={0,1,0,-1},dy[4]={1,0,-1,0};逆时针方向为右、上、左、下,对应dx[4]={0,-1,0,1},dy[4]={1,0,-1,0}。这些方向数组可应用于矩阵遍历等场景。
2026-03-15 22:37:24
305
原创 以数据结构之——树来体会深度优先搜索【dfs】和广度优先搜索【bfs】的妙用:学比特算法课的自用笔记
本文介绍了树遍历的两种基础算法:深度优先搜索(DFS)和广度优先搜索(BFS)。DFS采用递归方式"一条路走到黑",实现代码使用标记数组避免重复访问。BFS采用队列实现"层序遍历",依次处理每层节点。两种算法都适用于无根树,通过邻接表存储边关系。文中提供了完整的C++实现代码,包含详细注释和运行示例,可作为算法学习的实用笔记。
2026-03-14 20:41:35
93
原创 vector的所有初始化用法/方式
本文介绍了C++中vector容器的多种初始化方式。vector是一种动态数组,可以存储不同类型的数据。示例展示了8种初始化方法:创建空数组、指定大小数组、初始化固定值数组、列表初始化数组,以及存储字符串、结构体等特殊类型。还演示了创建二维vector和使用vector数组的方法。vector的灵活性使其成为处理动态数据的理想选择,支持任意数据类型的存储和多维结构实现。
2026-03-09 23:34:15
103
原创 数据结构之顺序表的插入+删除+查找+修改操作【主函数一步一输出,代码更加清晰直观】
本文介绍了数组的基本操作实现,包括插入、删除、查找和修改功能。尾插法时间复杂度为O(1),头插法和任意位置插入为O(N)。删除操作同样分为尾删(O(1))、头删(O(N))和任意位置删除。查找功能遍历数组寻找元素,修改操作直接替换指定位置的值。代码采用逐步输出的方式展示操作过程,清晰直观地呈现了数组在各种操作下的变化过程。这些基础操作为理解数据结构提供了良好的实践范例。
2026-03-09 19:47:42
77
原创 算法竞赛之最强排序算法:sort()/stable_sort()
摘要:sort()和stable_sort()是算法竞赛中常用的高效排序函数,时间复杂度均为O(nlogn)。sort()基于快速排序+插入排序+堆排序的混合算法,但不稳定;stable_sort()是其稳定版本。两者语法相同:sort(起始,结束,比较函数),比较函数定义排序规则(升序或降序)。在竞赛中,这两个函数可替代大多数排序算法,其中stable_sort()能保持元素相对位置不变,适用于需要稳定排序的场景。
2026-03-09 18:04:59
549
原创 在大学的算法竞赛中时间复杂度和空间复杂度的临界点【最大值】
C++空间限制通常是128~256MB,也就是3*pow(10,7)大小的一维数组,或者5000*5000大小的二维数组。C++通常限时是1到2秒【一个算法的执行次数/时间复杂度是pow(10,7) /(10的7次方) 次】算法竞赛适用于:蓝桥杯,acm,百度之星,天梯赛.....【其他的没参加过,无法给予有效评价】满足以上的时间复杂度和空间复杂度都可以确保不会因代码运行超时而扣分。
2026-03-07 23:48:25
40
原创 c语言和c++面向对象编程之结构体的易错点以及区别【两者不能一概而论】
摘要:本文对比了C和C++语言中结构体实例化的差异。在C语言中,实例化结构体必须使用完整形式"struct person p",或通过typedef简化为"er p";而C++允许直接简写为"person p"。文章提供了两种C语言修改方案:①使用完整声明"struct person p";②通过typedef创建别名"er p"。同时展示了C++中更简洁的实例化方式,并解释了不同语言环境下的编译设置要求(C
2026-03-07 11:18:56
174
原创 c++编程中的常用运算符的优先级
本文介绍了常见运算符的优先级顺序,从高到低依次为:圆括号()、自增/自减运算符(++/--)、单目运算符(+/-)、乘除(*/)、加减(+/-)、关系运算符(</>等)以及赋值运算符(=)。其中圆括号具有最高优先级,可以用于改变运算顺序,使表达式计算更加清晰方便。了解这些优先级有助于正确编写和解析数学表达式。
2026-03-06 18:33:19
25
原创 c++中n/=2和n>>=1的区别【n为一个任意整数】【除法与位运算中移位操作符的差异】
摘要:整数除法(n/=2)与右移赋值(n>>=1)在正整数处理时结果相同但效率不同,右移运算更高效。负整数处理时,除法向零取整,右移运算因补码机制可能产生差异。建议正整数优先使用右移运算提升效率,负整数则采用整数除法确保结果正确。二者的选择需考虑数值范围和应用场景,在算法优化和嵌入式系统中可优先考虑位运算的效率优势。
2026-03-06 17:43:08
549
原创 左移操作符/右移操作符【<</>>】的巧记方法
文章摘要:本文介绍了C++中位运算符的规律。通过代码示例展示了整型变量左移和右移操作的效果:左移一位相当于乘以2,右移一位相当于除以2。总结规律为:左移n位等价于乘以2的n次方,右移n位等价于除以2的n次方。需要注意的是右移操作可能导致精度丢失,因为整数除法会舍弃小数部分。
2026-03-05 15:10:08
21
原创 进制转换(plus版本)输入一个十进制,转换成二进制到三十六进制之间的任意一个进制
该摘要解释了为什么进制转换限制在36进制:因为从10开始用字母A到Z表示数值10-35,字母用完后无法继续扩展。文章提供了一个C++代码实现任意进制(2-36)的数字转换功能:处理输入数字n和目标进制x,分情况处理10以下(直接输出数字)和10-36进制(用A-Z表示10-35),通过取余和除法运算完成转换,最后倒序输出结果。代码支持零值处理并正确实现了数字到字母的映射转换。
2026-03-05 14:23:53
38
原创 进制转化,输入十进制,输出它的十六进制/十进制/八进制形式【uppercase】
该代码实现了一个简单的进制转换程序,能够将输入的整数分别转换为十六进制、十进制和八进制输出。程序使用C++编写,通过标准输入获取整数,然后利用cout的格式控制符hex、dec和oct实现不同进制的转换输出。其中十六进制和八进制输出都采用大写字母格式。虽然二进制转换未直接实现(注释部分),但提示了可通过循环对2取余的方法实现。程序简洁高效,展示了C++中基本的进制转换方法。
2026-03-04 23:14:32
386
原创 c++面向对象编程之多继承
摘要:本文展示了C++多重继承中成员变量冲突的解决方案。原代码中print类同时继承a、b、c三个基类,其中a和b都包含base成员变量,导致直接访问p.base时出现二义性错误。修复方法是通过作用域解析运算符明确指定要访问的基类成员,如p.a::base和p.b::base。修改后的代码成功输出了各基类的成员变量值:p.ar=1、p.br=2、p.cr=3、p.a::base=520、p.b::base=1314。这演示了处理多重继承命名冲突的有效方式。
2026-03-04 10:07:53
31
原创 c++面向对象编程之继承中的构造函数和析构函数的运行顺序
本文展示了C++中构造函数和析构函数在继承中的调用顺序。通过animal父类和cat子类的示例代码,演示了构造函数的调用顺序是父类到子类(animal→cat),而析构函数的调用顺序则是子类到父类(cat→animal),遵循"后进先出"的栈式原则。程序运行结果验证了:对象生命周期结束时析构函数会自动调用,且子类对象会先调用自身析构函数再调用父类析构函数。
2026-03-04 09:44:15
43
原创 c++面向对象编程之访问权限与继承方法的(3*3表格)
摘要:本文通过C++代码示例展示了三种继承方式(public、protected、private)对成员访问权限的影响。在public继承中,子类可访问父类的public和protected成员;protected继承将父类public成员转为protected;private继承则使所有父类成员在子类中变为private。测试函数表明,类外只能访问public成员,而protected和private成员在类外均不可访问。继承方式会逐级改变成员的可访问性,如私有继承后,所有父类成员在派生类中都不可再被访问
2026-03-03 23:36:05
140
原创 c++面向对象编程之继承
继承机制用于避免代码冗余,允许子类直接调用父类的公共成员。通过将猫和狗类的共同"eat()"方法提取到父类animal中,减少了重复代码。继承语法为"class 子类 : public 父类{}",子类对象可直接使用父类的public成员。示例显示,继承后cat和dog类只需定义各自特有的"sayhi()"方法,共享的"eat()"方法由父类提供,实现了代码复用。
2026-03-03 11:42:41
248
原创 c++面向对象编程之友元——关键字:friend
C++友元机制允许外部访问类的私有成员,主要包括三种形式:1)全局函数访问私有成员,通过在类中声明friend函数实现;2)类间访问私有成员,通过声明friend class授权;3)成员函数访问私有成员,通过精确声明friend成员函数实现。文中通过具体代码示例展示了每种友元的使用方法和效果,包括如何解决访问权限问题,以及如何精细化控制访问权限(如只允许特定成员函数访问私有成员)。友元机制突破了封装限制,但需谨慎使用,文中最后演示了如何实现"见人下菜碟"式的精细化访问控制。
2026-03-02 00:28:59
284
原创 c++面向对象编程之this指针的应用
C++中this指针的作用:1)解决成员变量与形参的命名冲突,通过this->明确指定成员变量;2)通过*this可以获取当前对象本身。当形参与成员变量同名时,直接赋值会导致成员变量未被正确初始化,使用this->可精确指向成员变量。*this表示解引用当前对象指针,可获得对象实体,其地址与对象本身地址相同。示例显示this指针能有效区分同名变量,确保成员变量正确赋值。
2026-02-28 18:34:15
138
原创 c++面向对象编程之初始化列表
展示了一个C++英雄类的实现,包含默认构造函数和两个参数化构造函数。第一个带参构造函数接收英雄名称并输出固定属性值;第二个使用初始化列表接收名称、血量和速度参数。主函数演示了三种对象实例化方式:无参构造、单参数构造和三参数构造。类中封装了英雄名称、血量和移动速度三个私有属性,通过构造函数进行不同方式的初始化。
2026-02-28 17:43:21
80
原创 c++中的析构函数;和构造函数的区别
本文介绍了析构函数的基本概念和使用方法。析构函数在对象销毁前自动调用,其特征包括:1)函数名与类名相同且前缀波浪号(~);2)无返回值;3)不能有参数。通过Hero类的代码示例展示了析构函数(~Hero)与构造函数的区别:构造函数可带参数且能多次调用,而析构函数无参数且只能自动调用一次。程序运行时会先执行构造函数,在对象生命周期结束时自动调用析构函数。文中还演示了不同对象创建方式对构造函数调用的影响,以及函数栈销毁时析构函数的自动调用机制。
2026-02-27 18:55:28
278
原创 c++面向对象中类的构造函数【采用了一点点王者荣耀的元素】
本文介绍了C++中构造函数的注意事项和使用方法。构造函数需与类名一致,不写返回值类型,可带参数。文中提供了构造函数的模板示例,包括无参和有参构造函数的定义方式,并展示了如何初始化类成员变量。通过一个英雄类的具体代码实现,演示了默认构造函数、带一个参数和带两个参数的构造函数的调用方式。最后给出了不同方式实例化对象时构造函数的具体调用情况,帮助理解构造函数在实际编程中的应用。
2026-02-27 00:26:58
201
原创 c++中面向对象编程中public和protected和private的权限
保护权限 protected 类内可以访问,类外不可以访问 子类可以访问。私有权限 private 类内可以访问,类外不可以访问 子类不可以访问。公共权限 public 类内可以访问,类外也可以访问。
2026-02-26 15:04:35
93
原创 苹果手机密码锁了后如何解锁(今天刚研究了)
摘要:苹果手机解除"已停用"状态的三种方法 本文介绍了三种解除苹果手机已停用状态的方法:1) 记得AppleID账号密码可直接登录恢复;2) 仅记得账号可联系苹果客服(4006668800)重置密码;3) 合法渠道购买的设备可通过提供发票给苹果官方审核解锁。所有方法均需先通过爱思助手刷机进入初始化状态。文中强调这是目前仅有的三种官方认可解决方案,即使前往苹果专卖店也无法通过其他方式恢复。
2026-02-25 22:32:50
1274
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅