自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(44)
  • 收藏
  • 关注

原创 状压 dp

本文介绍了状态压缩动态规划(状压DP)的基本概念和应用。文章首先通过二进制枚举解释状态压缩技巧,即用整数二进制位表示集合元素状态(如灯的开关)。随后通过三道经典例题演示应用:1)GEPPETTO问题使用二进制枚举处理调料冲突;2)关灯问题II将状态视为图节点,用BFS求最短路;3)糖果问题类似关灯问题,通过BFS搜索状态转换。文中强调状态压缩能优化空间和时间复杂度,并提供了详细的代码实现。整体展示了状态压缩在解决组合优化问题中的高效性。

2025-09-12 12:37:57 886

原创 第十六届蓝桥杯软件赛 C 组省赛 C++ 题解

本文是第十六届蓝桥杯软件赛C组省赛的C++题解,共包含8道题目: 数位倍数:暴力枚举1-202504,统计数位和是5倍数的数字个数 2025:统计1-20250412中数字包含至少1个0、2个2、1个5的数字个数 2025图形:找规律输出周期性"2025"图形 最短距离:贪心算法,排序后对应位置差的绝对值之和最小 冷热数据队列:使用哈希表和双向链表模拟数据队列操作 倒水:二分答案,检查能否使所有瓶子水量≥x 拼好数:贪心+分类讨论,统计6的个数并分组 登山:图论+并查集+单调栈,处理二维

2025-09-12 12:37:10 676 4

原创 最近公共祖先

本文系统介绍了算法竞赛中求解最近公共祖先(LCA)的几种方法。首先解释了LCA的定义和7个重要性质,包括距离公式和遍历顺序特性。然后详细讲解了三种主要解法:朴素向上标记法(单次查询O(n))、树上倍增法(预处理O(nlogn),查询O(logn))和Tarjan离线算法(一次DFS处理批量查询)。文章通过二叉树问题等例题展示了代码实现,比较了各种方法的优缺点,并提供了标准模板题的两种解法代码。最后指出数链剖分等高级方法将在后续文章中介绍。

2025-09-09 18:45:02 1054

原创 状压 dp --- 数据范围小

本文介绍了状态压缩动态规划(状压dp)的应用场景和解题方法。主要内容包括:1.状压dp适用于数据范围小但暴搜会超时的问题;2.通过"糖果"案例讲解状压dp解法,包括状态表示、转移方程和初始化;3.通过"PRZ"案例演示如何枚举子状态解决问题。两个案例分别展示了状压dp的不同应用场景和实现细节,强调状态转移的正确性和避免环路问题。文章提供了完整的代码实现,帮助读者理解状压dp的实际应用。

2025-09-06 17:13:55 881

原创 状压 dp --- 棋盘覆盖问题

本文介绍了状压DP在棋盘覆盖问题中的应用,通过两个典型例题展示了解题思路和代码实现。首先分析了棋盘覆盖问题的特点(小棋盘、方案数巨大),提出用状态压缩和动态规划解决。以"互不侵犯"和"Corn Fields"为例,详细讲解了状态表示、转移方程、预处理优化和边界处理,并给出了完整的C++代码实现。这类问题的核心在于利用位运算高效处理状态约束,通过预处理合法状态降低时间复杂度。文章最后总结了状压DP解决棋盘覆盖问题的通用方法。

2025-09-05 21:11:13 660

原创 状压 dp --- TSP 问题

本文介绍了旅行商问题(TSP)及其状态压缩动态规划解法。TSP要求在n个城市间找到最短哈密顿回路,属于NP完全问题。暴力枚举全排列时间复杂度为O(nn!),而状压DP可优化至O(nn*2^n)。文章详细讲解了状态表示、转移方程、初始化和填表顺序,并提供了两种代码实现版本:先枚举最后一个点或前一个点。最后指出该方法同样适用于求最短Hamilton路径问题。该方法通过状态压缩有效避免了重复访问,适合处理n≤20规模的问题。

2025-09-05 17:55:55 798

原创 C++ 类和对象(一)

本文介绍了C++中类和对象的基础知识,重点对比了C++与C语言在实现栈结构时的差异。主要内容包括:1. 类的定义格式及成员变量/函数的声明方式;2. C++通过封装将数据和方法结合,解决了C语言中命名冲突和传参问题;3. 访问限定符的作用及类域概念;4. 类实例化过程及对象存储机制(只存储成员变量);5. 内存对齐规则及其意义。文章通过具体代码示例展示了C++面向对象编程的优势,如减少前缀、自动关联对象等特性,并解释了类与结构体的区别、内联函数特性等核心概念。

2025-09-03 19:03:15 767

原创 Manacher 算法相关练习题

本文介绍了使用Manacher算法解决四道回文串相关题目:1. ABB题:通过计算最长回文后缀确定需添加字符数量;2. 啦啦队排练题:统计奇数长度回文串频次求解前K大乘积;3. ANT-Antisymmetry题:处理反对称字符串的特殊性质;4. 最长双回文串题:预处理分割点两侧回文长度。各题均给出算法原理和C++实现代码,展示了Manacher算法在回文问题中的灵活应用。文章建议先掌握基础Manacher算法再解题。

2025-09-03 16:08:52 714

原创 Manacher 算法

本文介绍了高效解决回文串问题的Manacher算法。该算法通过构建回文半径数组,利用最右回文串加速填表过程,将时间复杂度优化至O(n)。文章详细讲解了算法原理(包括四种情况分类讨论)、预处理方法、代码实现(仅需4行核心代码)以及模板题目应用。相比O(n²)的中心扩展算法,Manacher算法通过避免指针回退显著提升效率,适合处理大规模数据。作者建议读者通过刻意练习掌握这一算法。

2025-09-02 10:22:11 1406

原创 中心扩展算法

中心扩展算法是一种用于查找回文子串的算法。它通过枚举所有可能的中心点,并向两侧扩展来寻找回文子串。算法首先对字符串进行预处理,在字符间插入特殊字符(如#),将偶回文转换为奇回文,简化处理。然后遍历每个中心点,逐步扩大半径直到字符不匹配,记录最长回文半径。预处理后最长回文半径减1即为原字符串的回文长度。该算法时间复杂度为O(n²),适合处理较短字符串。文中还提到了更高效的Manacher算法,将在后续介绍。

2025-09-01 20:15:08 660

原创 KMP 算法相关练习题

本文分享了四道KMP算法相关的编程题目及解题思路:1)剪花布条问题,通过KMP算法实现非重叠字符串匹配;2)SeektheName问题,利用前缀函数求字符串所有border长度;3)ABB问题,用KMP算法求最长回文后缀长度;4)CensoringS问题,结合栈结构实现字符串消除操作。每道题目都提供了详细算法原理分析和C++代码实现,适合已掌握KMP基础的读者进阶练习。

2025-08-31 09:30:41 1009

原创 线段树相关算法题(5)

线段树在维护区间修改过程中,有些操作是无法“懒”下来的,比如:对整个区间的每一个数执行开根号操作。这时只能从上往下把所有的点全部修改。但是,如果在修改的过程中发现,整个区间在修改到一定程度的时候,整个区间就无需修改。那么,就可以通过剪枝操作,优化区间的修改。这样的线段树也叫势能线段树。

2025-08-30 22:19:07 682

原创 kmp 算法

本文介绍了KMP算法的核心概念和应用。重点讲解了前缀函数的定义、计算方法和用途,包括字符串匹配、周期和循环节判断。通过将模式串与主串拼接后计算前缀函数,可以高效解决字符串匹配问题。文章还提供了KMP算法模板和两个典型题目(PowerStrings和RadioTransmission)的解法,展示了如何利用前缀函数求解字符串周期问题。最后比较了前缀函数版本和传统next数组版本的异同,指出两者本质相同。

2025-08-30 22:18:34 1158

原创 线段树相关算法题(2)

两道线段树相关算法题

2025-08-24 22:11:46 656

原创 线段树相关算法题(1)

本文分享了两道线段树算法题,从简单到中等难度。第一题"忠诚"是静态区间最小值查询问题,使用基础线段树模板即可解决。第二题"开关"是动态区间修改问题,通过将灯的状态转换为0/1,转化为区间和查询与修改操作,并引入懒标记优化。文章详细讲解了线段树的实现要点,包括结构体设计、pushup/pushdown操作、懒标记处理等核心内容,并提供了完整的代码实现。适合有一定线段树基础的读者进行练习和巩固。

2025-08-24 18:51:02 1124

原创 高阶数据结构---ST表

ST表是一种基于动态规划和倍增思想的高阶数据结构,用于高效解决静态区间查询问题(如区间最值、GCD等)。其预处理时间复杂度为O(nlogn),查询时间为O(1)。ST表通过构建二维稀疏表存储不同长度的区间信息,相比线段树代码更简洁但不支持动态修改。文章详细介绍了ST表的实现原理、查询方法(包括对数优化技巧)和典型应用场景,并提供了RMQ、GCD等模板题的代码实现。适合处理大规模静态数据查询问题。

2025-08-23 18:02:00 984

原创 01分数规划

【摘要】01分数规划是一种基于二分答案的算法,用于解决从n个物品中选择k个使总性价比最大的问题。传统贪心策略和动态规划方法存在局限,而二分答案结合贪心是有效解法。具体步骤:1)二分枚举可能的性价比x;2)通过check函数验证能否选出k个物品满足条件(将a[i]-x*b[i]排序后取前k大值求和判断)。文章提供了两个模板题:整数二分(小咪买东西)和浮点数二分(Dropping Test),并给出相应代码实现。该算法适用于需要最大化收益代价比的优化问题。

2025-08-23 11:26:27 625

原创 每天两道算法题:DAY4

本文分析了两个算法题目:"开心的金明"和"借教室"。"开心的金明"是01背包模板题,通过动态规划求解,状态f[i][j]表示前i个物品在价格不超过j时价格与重要度乘积的最大值,提供了普通和空间优化两种代码实现。"借教室"采用二分答案+差分算法,通过二分查找第一个无法满足的订单天数,利用差分数组处理区间修改,时间复杂度O(nlogn)。两个题目都强调了基础算法的重要性,01背包需要熟练掌握,而二分查找的关键在于识别问题的二段性特征

2025-08-18 11:10:15 927

原创 每日两道算法题:DAY3

本文解析了两个编程问题:1)棋盘问题要求计算给定尺寸棋盘中的正方形和长方形数量,通过暴力枚举法实现,时间复杂度为O(n⁴);2)USACO模拟题采用贪心策略,将商品按价格排序后优先购买低价商品直至满足需求。两题均强调在实际解题中应根据数据规模选择适当方法,优先保证代码正确性和通过率,复杂的数学推导可留待赛后研究。第一题重点训练矩形枚举技巧,第二题提醒不要过度复杂化简单问题。

2025-08-17 22:17:10 442

原创 每天两道算法题:DAY2

本文解析了两道算法题目:1. 搭配购买问题:该问题可转化为01背包问题,需先预处理合并连通块的价格和价值。提供了三种实现方式(DFS、BFS、并查集)进行连通块合并,再使用01背包动态规划求解。强调01背包问题的重要性,建议完全掌握其原理。2. 最接近神的人问题:本质是求数组逆序对数量,通过归并排序的分治思想实现O(nlogn)解法。指出该模板对后续学习高阶数据结构的重要性,建议理解递归过程并熟练掌握。两道题目均属于模板题,需要深入理解算法原理并熟练实现代码。

2025-08-17 19:45:12 478

原创 每天两道算法题:DAY1

在算法竞赛中,签到题是一定要拿满分的,签到题要的是快准狠,竞赛时千万不能着急、慌张,想明白之后再写,遇到 bug 在草稿纸上仔细模拟,再说一遍,千万不要着急,越着急越错。签到题一般不会很难,当发现自己做不出来时,可能是题目理解错了。一定要仔细读题!!!

2025-08-17 17:19:37 697

原创 从0到1:C++ 语法之引用

引用不是新定义一个变量,而是给已经存在的变量取了一个别名,在语法层面上编译器不会为引用变量开辟内存空间(但引用的底层还是指针,本质上还是要开空间的,本文的最后会带大家看),它和引用的变量共同使用同一块内存空间。比如:水浒传中的李逵,宋江叫“”铁牛,江湖人称“黑旋风”;林冲,外号豹子头。引用的语法:类型& 引用别名 = 引用对象;int& b = a;// b是a的别名int& c = a;int& d = b;

2025-08-14 22:14:52 1528

原创 从0到1:C++ 语法之 nullptr

本文介绍了C++11中引入的nullptr关键字。首先分析了C语言中NULL的不足:NULL在C++中可能被定义为0,导致函数重载时产生歧义。接着详细说明了nullptr的优势:它专门表示空指针,能避免类型转换问题,提高代码安全性。通过多个代码示例展示了NULL和nullptr在函数重载中的不同表现,以及nullptr需要强制类型转换的情况。最后总结建议:在C++中应优先使用nullptr而非NULL来表示空指针。

2025-08-14 16:27:44 267

原创 从0到1:C++ 语法之函数重载

C++函数重载机制解析 本文介绍了C++中的函数重载特性。函数重载允许在同一作用域中使用同名函数,但要求参数类型或数量不同。相比C语言需要为不同类型设计不同函数名,C++通过参数特征区分同名函数,提高了代码灵活性。文章通过实例展示了参数数量不同、类型不同、顺序不同三种重载方式,并指出返回值不同不能构成重载条件。同时解释了带默认参数的函数重载注意事项。函数重载是C++对C语言的重要改进,使代码更具可读性和扩展性。

2025-08-13 12:30:58 747

原创 从0到1:C++语法之缺省参数

缺省参数是声名或定义函数时为函数的参数指定一个缺省值。在调用该函数时,如果没有指定实参则采用该形参的缺省值,否则使用指定的形参,缺省参数分为全缺省和半缺省参数。//没有传参时,使用参数的默认值Func(10);//传参时,使用指定的形参考虑到 C 语言的不足,C++ 引入了缺省参数,使得在一些请款下变得更加灵活。场景:你在项目里写了一个栈,栈是需要扩容的,扩容就是要去堆上开辟一块空间。频繁地扩容消耗是非常大的。

2025-08-12 16:23:37 168

原创 从0到1:C++语法之命名空间

定义命名空间,需要用到namespace 关键字,后面跟命名空间的名字(一般开发中是用项目名字做命名空间名),最后加一对{}即可,{}中即为命名空间的成员。命名空间中可以定义变量/函数/类型等。// 命名空间中可以定义变量/函数/类型int val;namespace 本质是定义出了一个域(这里区分结构体),这个域跟全局域各自独立,不同的域中可以定义同名变量,所以上面的 rand 就不会发生冲突了。C++ 域中有函数局部域、全局域、命名空间域、类域;

2025-08-12 12:57:31 1010

原创 高阶数据结构------并查集

在一些应用问题中,需要在此过程中要适合于描述这类问题的抽象数据结构类型成为比如:亲戚关系,朋友敌人关系,食物链关系。比如:给定10个人,5对关系,没对关系描述两个人,表示这两个人是亲戚,最后问你某两个人之间是否是亲戚关系。再比如:给定10个人,5对关系,没对关系描述两个人,表示这两个人之间的关系(朋友或者敌人),最后问你某两个人之间的关系。…………上述问题就可以使用并查集这一数据结构来解决。

2025-07-01 22:21:43 859 1

原创 数据结构——队列的模拟实现

首先来认识一下队列:队列就像我们上学时的排队一样,有一个队头也有一个队尾。有人入队的话就从对尾入队出队只能从对头出队,队头出队之后后面的人才可以选择出队。队列的特点就是:队尾入,对头出,先进先出(first in first out)(先入队的先出队)。1 2 3 4 入——1 2 3 4出。队列的模拟实现是选择数组还是链表呢?队列的特定规则需要两个指针分别指向首元素和尾原元素,如果选用数组的话,删除队首的数据就比较复杂(向前覆盖,时间复杂度为O(N))。

2024-12-17 18:39:44 1080

原创 数据结构——栈的模拟实现

与顺序表和单链表不同的是:顺序表和单链表都可以在头部和尾部插入和删除数据,但是栈的结构就锁死了(栈的底部是堵死的)栈只能从栈顶插入(数据入栈)和删除(数据出栈)数据————last in first out(后进先出)(最后入栈的数据要第一个出栈如果进栈过程中不允许出栈:入栈 1 2 3 4————出栈4 3 2 1。

2024-12-14 22:29:54 1160

原创 数据结构(3)单链表的模拟实现

链表的核心是结点,定义链表的结构就是定义结点的结构。至于之所以要将int进行typedef重命名,参考上一篇博客————顺序表。相较于顺序表单链表在中间或者头部插入或者删除数据时间复杂度为O(1),而顺序表为O(n).单链表在尾部插入或者删除数据时间复杂度为O(n),而顺序表为O(1)。不同的数据结构都有各自独特的优势(当然也有劣势)没有哪个好哪个坏这一说法看实际应用的场景,不同的场景要使用不同的数据结构!

2024-12-10 22:32:33 1020 1

原创 数据结构(2)——顺序表的模拟实现

通过数据结构(1)对于算法复杂度的理解,现在我们正式进入数据结构的核心内容,今天,先来使用C语言实现一下数据结构中最简单的顺序表。首先介绍一下顺序表的概念,先从线性表说起。线性表:n个具有相同结构的数据元素的有限序列。在逻辑结构上一定是线性的,在物理结构上不一定是线性的。顺序表:如果线性表的物理地址连续,那么其就算是顺序表。一般情况下采用数组存储。顺序表的底层逻辑就是数组。但相较于数组,它增添了一些功能。也就是对数组进行一系列的功能包装,就形成了顺序表。

2024-12-04 18:24:54 1228 2

原创 算法与数据结构(1)复杂度

数据结构是计算机存储与组织数据的方式(包括增加数据、删除数据、查找数据、改写数据等)指相互之间存在一种或多种特定关系的数据元素的集合。没有一种单一的数据结构对所有的用途都有用,所以我们要学习各种各样的数据结构,如:线性表、树、图、哈希……数组 int arr[4]={0,1,2,3};就是一个简单的数据结构。可以插入删除查找修改其中的元素。但是数组元素只能时同类型的,数组这一单一的数据结构不是对所有的用途都有用,比如不同类型的数据,这时候我们就可以用另外一种数据结构————结构体。

2024-11-29 21:33:56 2196 1

原创 C语言中的文件操作

磁盘(硬盘)上的文件是文件。在程序设计中,我们一般谈到的文件有两种:程序文件以及数据文件(从文件功能的角度分类)。

2024-11-25 17:11:54 976

原创 C语言中的预处理详解

C语言中的预处理

2024-11-25 15:55:42 540

原创 动态内存管理

再想要找回p数组中的元素(printf函数要通过str去找p数组中的字符,找到一个打印一个) 已经不可能了,(但如果幸运的话,也有可能打印出hello world)原因在于str仍然是空指针,strcpy实现的过程中一定会有对str的解引用操作,对空指针解引用是非法的,会报警告。本程序中由于开辟的空间过大,内存不足,无法成功开辟,就会返回空指针NULL,形成对空指针的解引用。且这个程序在使用free函数之后没有将str置NULL,str的值是不确定的,就会形成野指针。

2024-11-21 18:27:39 1962 1

原创 联合体和枚举

这种代码虽然可行,用起来也方便,但是结构体中包含了所有商品个各种属性,这样结构题的大小就会偏大(实际上每个商品不一定包含上面的全部属性)就会浪费内存,代码性能就会降低。联合体也存在内存对齐,当最大成员大小不是最大对齐数的整数倍时,就要对齐到最大对齐数的整数倍(关于最大对齐数的相关内容,请参考上一篇博客:结构体)联合体的关键字是union,联合体类型的创建方法——变量的创建方法——变量的输入输出等——和结构体类似(具体可以看我的上一篇博客:结构体)一个联合变量的大小,至少是那个最大成员的大小。

2024-11-18 21:13:52 729 2

原创 自定义类型:结构体

当然是传址,无论是什么类型的地址,大小都仅仅只是4个字节,但入果是传值,要去创建临时变量存放1000多个整型数据的值,空间的开销太大,容易导致性能下降。答案是不⾏的,因为Node是对前⾯的匿名结构体类型的重命名产⽣的,但是在匿名结构体内部提前使 ⽤Node类型来创建成员变量,这是不⾏的。3. 结构体总⼤⼩为最⼤对⻬数(结构体中每个成员变量都有⼀个对⻬数,所有对⻬数中最⼤的)的。4. 如果嵌套了结构体的情况,嵌套的结构体成员对⻬到⾃⼰的成员中最⼤对⻬数的整数倍处,结构。⽽对⻬的内存访问仅需要⼀次访问。

2024-11-17 22:05:45 1063 4

原创 一篇水文抒发我对于编程的反思

就在今天(2024年11月17日早上9:00左右)我打开了比特的作业解析视频,听完老师对这道题目的讲解,让我对编程,对以后的学习有了新的看法。2.关于代码的可读性:老师提供的代码用整形变量del来表示要去除的值,del的原型是delete(删除),使用户或者其他程序员可以清楚的知道这一行代码的含义和目的。并且严格意义上讲不满足题目的要。求,题目要求删除a中的元素,但我的代码实际上并没有做到这一点,只是跳过了这一元素,把。综上,再回想我写的代码,无论是时间和空间的开销,还是代码的可读性都有一定的缺陷,

2024-11-17 11:40:07 301

原创 数据在内存中的存储

具体的编译器),另外,对于位数⼤于8位的处理器,例如16位或者32位的处理器,由于寄存器宽度⼤ 于⼀个字节,那么必然存在着⼀个如何将多个字节安排的问题。这是因为在计算机系统中,我们是以字节为单位的,每个地址单元都对应着⼀个字节,⼀个字节为8 bit 位,但是在C语⾔中除了8 bit 的 char。很多的ARM,DSP都为⼩端模式。是指数据的低位字节内容保存在内存的⾼地址处,⽽数据的⾼位字节内容,保存在内存的低地址处。是指数据的低位字节内容保存在内存的低地址处,⽽数据的⾼位字节内容,保存在内存的⾼地址处。

2024-11-14 16:14:37 1808 2

原创 几道指针运算相关的笔试题

解析:&a(&数组名)取出的是整个数组的地址,&(a+1)强制转化成int*类型赋给指针变量ptr1。&(a+1)跳过整个数组,由于指针变量ptr是int型,因此减一跳过1个整型,过一个字节,指向 2,*(a+1)获得整型数据2。a是数组名,数组名表示数组首元素的地址,a数组的元素是int型,+1跳。指向5,解引用 得到整形数据5。今天来分享几道和指针运算相关的笔试题目。

2024-11-10 23:11:08 545

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除