
蓝桥杯备考
文章平均质量分 88
备考25届蓝桥杯
ChoSeitaku
是一名在校大学生,目前在做C语言、C++、蓝桥杯、算法、考研数学、408的内容,后期会做深度学习、机器学习、神经网络、人工智能、AIGC、WEB3、开发相关的内容
展开
-
NO98十六届蓝桥杯备战|数论板块-质数|质数和合数|试除法|质数筛|埃氏筛|线性筛|线性筛素数|素数密度|Goldbach‘s Conjecture(C++)
关于时间复杂度,⽹上各个地⽅都有详细的证明。因为很⿇烦,⽽且涉及积分的知识,这⾥就不再赘述。先筛⼀下质数,然后在筛出来的质数中,找出两个数的和等于给定的数。每个数只会被⾃⾝最⼩的质因数筛掉⼀次,时间复杂度为O(n)上⼀个专题学习了如何判断⼀个数是否是质数,如果此时想知道。埃⽒筛的时间复杂度为:O(n log n)。线性筛法,⼜称欧拉筛法。中的素数⾥⾯,第k个素数是多少?,因此时间复杂度为O(原创 2025-04-19 18:58:52 · 840 阅读 · 0 评论 -
NO.97十六届蓝桥杯备战|数论板块-最大公约数和最小公倍数|欧几里得算法|秦九韶算法|小红的gcd(C++)
秦九韶算法是⼀种将⼀元n次多项式的求值问题转化为n个⼀次式的算法。其⼤⼤简化了计算过程,即使在现代,利⽤计算机解决多项式的求值问题时,秦九韶算法依然是最优的算法。证明gcd(a, b) = gcd(b, a mod b) ,思路:先证左边等于右边,再证右边等于左边。最⼤公约数Greatest Common Divisor,常缩写为gcd。三个数的最⼤公约数,先求其中两个的gcd,再与第三个求gcd。欧⼏⾥得算法也称辗转相除法,可以求出两个整数的最⼤公约数。这样对于⾼精度的数取模,就可以分阶段取模。原创 2025-04-18 15:06:03 · 799 阅读 · 0 评论 -
NO.96十六届蓝桥杯备战|图论基础-多源最短路|Floyd|Clear And Present Danger|灾后重建|无向图的最小环问题(C++)
在floyd算法中,我们是⼀个点⼀个点加⼊到最短路的更新中,那么这道题其实就是限制了我们加点的时机。当从前往后遍历每次询问的时候,直到时间点在询问的时间t之前的点,都可以加⼊到最短路的更新中。floyd算法本质是动态规划,⽤来求任意两个结点之间的最短路,也称插点法。通过不断在两点之间加⼊新的点,来更新最短路。适⽤于任何图,不管有向⽆向,边权正负,但是最短路必须存在(也就是不存在负环)。那么就可以⼀边读取询问,⼀边通过时间限制,更新最短路。多源最短路:即图中每对顶点间的最短路径。原创 2025-04-17 16:22:27 · 600 阅读 · 0 评论 -
NO.95十六届蓝桥杯备战|图论基础-单源最短路|负环|BF判断负环|SPFA判断负环|邮递员送信|采购特价产品|拉近距离|最短路计数(C++)
如果图中存在负环,那么有可能不存在最短路。原创 2025-04-16 21:01:50 · 911 阅读 · 0 评论 -
NO.94十六届蓝桥杯备战|图论基础-单源最短路|常规dijkstra|堆优化dijkstra|bellman-ford|spfa(C++)
在图G中,假设vi和vj为图中的两个顶点,那么vi到vj路径上所经过边的权值之和就称为带权路径⻓度。由于vi到vj的路径可能有多条,将带权路径⻓度最短的那条路径称为最短路径。原创 2025-04-16 20:58:08 · 1042 阅读 · 0 评论 -
NO.21|计算机网络|静态路由动态路由|路由协议|域名解析|DNS|网关|CSRF攻击|MAC地址IP地址|TCP三次握手四次挥手|TCP和UDP|TCP连接关闭|TCP慢启动
DNS劫持就是通过劫持了DNS服务器,通过某些手段取得某域名的解析记录控制权,进而修改此域名的解析结果,导致对该域名的访问由原IP地址转入到修改后的指定IP,其结果就是对特定的网址不能访问或访问的是假网址,从而实现窃取资料或者破坏原有正常服务的目的。最后,本地DNS服务器向域名的解析服务器发出请求,这时就能收到一个域名和IP地址对应关系,本地DNS服务器不仅要把IP地址返回给用户电脑,还要把这个对应关系保存在缓存中,以备下次别的用户查询时,可以直接返回结果,加快网络访问。打开浏览器,输入一个域名。原创 2025-04-15 21:17:16 · 1010 阅读 · 0 评论 -
NO.93十六届蓝桥杯备战|图论基础-拓扑排序|有向无环图|AOV网|摄像头|最大食物链计数|杂物(C++)
对于每⼀个事件i,完成它的最⼩时间为:完成前驱所有事件的最⼩时间中的最⼤值+当前事件的完成时间。因此,可以在拓扑排序的过程中,维护每⼀个事件完成的最⼩时间,然后更新当前事件的最⼩时间。拓扑排序的⽬标是将有向⽆环图中的所有结点排序,使得排在前⾯的结点不能依赖于排在后⾯的结点。对于每⼀个节点i,通过它的路径为:前驱所有结点的路径总数之和。因此,可以在拓扑排序的过程中,维护从起点开始到达每⼀个节点的路径总数。举⼀个现实中的例⼦:课程的学习是有优先次序的,如果规划不当会严重影响学习效果。拓扑排序判断是否有环。原创 2025-04-15 15:15:03 · 828 阅读 · 0 评论 -
NO.92十六届蓝桥杯备战|图论基础-最小生成树-Prim算法-Kruskal算法|买礼物|繁忙的都市|滑雪(C++)
一个具有n个顶点的连通图,其⽣成树为包含n-1条边和所有顶点的极⼩连通⼦图。对于⽣成树来说,若砍去⼀条边就会使图不连通图;若增加⼀条边就会形成回路。⼀个图的⽣成树可能有多个,将所有⽣成树中权值之和最⼩的树称为最⼩⽣成树。构造最⼩⽣成树有多种算法,典型的有普利姆(Prim)算法和克鲁斯卡尔(Kruskal)算法两种,它们都是基于贪⼼的策略。原创 2025-04-14 22:34:58 · 499 阅读 · 0 评论 -
NO.91十六届蓝桥杯备战|图论基础-图的存储和遍历|邻接矩阵|vector|链式前向星(C++)
图G是由顶点集V和边集E组成,记为G = (V, E),其中V(G)表⽰图G中顶点的有限⾮空集;E(G)表⽰图G中顶点之间的关系(边)集合。若Vv1v2vnVv1v2vn,则⽤∣V∣|V|∣V∣表⽰图G中顶点的个数,也称图G的阶,Euv∣u∈Vv∈VEuv∣u∈Vv∈V,⽤∣E∣|E|∣E∣表⽰图G中边的条数。图是较线性表和树更为复杂的数据结构。原创 2025-04-11 22:08:35 · 1432 阅读 · 0 评论 -
NO.90十六届蓝桥杯备战|动态规划-区间DP|回文字串|Treats for the Cows|石子合并|248(C++)
区间dp也是线性dp的⼀种,它⽤区间的左右端点来描述状态,通过⼩区间的解来推导出⼤区间的解。因此,区间DP的核⼼思想是将⼤区间划分为⼩区间,它的状态转移⽅程通常依赖于区间的划分点。在数组后⾯,将原始数组复写⼀遍,然后在倍增之后的数组上做⼀次⽯⼦合并(弱化版),就能得到以所有位置为起点并且⻓度为len 的最⼩合并代价。贪⼼:每次都拿两边最⼩的。反例:4, 1, 5, 3。先找重复⼦问题定义状态表⽰。处理环形问题的技巧:倍增。原创 2025-04-11 20:07:47 · 952 阅读 · 0 评论 -
NO.89十六届蓝桥杯备战|动态规划-分组背包-混合背包-多维费用背包|通天之分组背包|排兵布阵|樱花|L国的战斗间谍(C++)
⼀个城堡⼀个城堡分析,对于第n个城堡,考虑派遣的⼈数应该在所有玩家对这个城堡派遣⼈数中考虑。⽐如⽰例⼆的第三个城堡,我们考虑派遣的⼈数就是1和13 (因为要严格⼤于两倍,⼤⼀点就是最好的)。因此,把每⼀个城堡看成⼀个⼩组,所有玩家在这个城堡派遣的⼈数看成⼀个⼀个物品,要求的就是在派遣⼈数不超过m 的情况下的最⼤得分,符合分组背包。⼩优化:对每个城堡中玩家的派遣⼈数从⼩到⼤排序,这样在选择第k个⼈数的时候,总得分就是k × i。因为⼀个组⾥⾯最多只能挑⼀个元素,所以我们就以⼀个组为单位。原创 2025-04-11 16:01:01 · 498 阅读 · 0 评论 -
NO.88十六届蓝桥杯备战|动态规划-多重背包|摆花(C++)
正好是多重背包求⽅案数的模型,我们可以⽤多重背包的思考⽅式来解决这道题。个,在总数恰好等于m 时的总⽅案数。连续的⼆进制数有⼀个性质,就是。解法⼆:转化成01背包问题。优化⽅式:⽤⼆进制将。题意:每⼀种花可以选。原创 2025-04-10 21:56:47 · 826 阅读 · 0 评论 -
NO.87十六届蓝桥杯备战|动态规划-完全背包|疯狂的采药|Buying Hay|纪念品(C++)
因为纪念品可以在当天买,当天卖。因此所有的交易情况,就可以转换成"某天买隔天卖"的情况。从前往后,⼀天⼀天的考虑如何最⼤⾦币。第⼆问仅需修改⼀下初始化以及最终结果即可。原创 2025-04-10 20:21:34 · 955 阅读 · 0 评论 -
NO.86十六届蓝桥杯备战|动态规划-01背包|采药|小A点菜|Cow Frisbee Team(C++)
背包问题是动态规划中最经典的问题,很多题⽬或多或少都有背包问题的影⼦。它的基本形式是:给定⼀组物品,每个物品有体积和价值,在不超过背包容量的情况下,选择物品使得总价值最⼤。背包问题求⽅案数,稍微修改⼀个状态表⽰,然后根据具体问题分析状态转移⽅程和初始化即可。基本01 背包问题,将时间看成体积,就是标准的不放满的01 背包问题。第⼆问仅需修改⼀下初始化以及最终结果即可。01 背包问题变形。原创 2025-04-10 16:35:59 · 645 阅读 · 0 评论 -
NO.85十六届蓝桥杯备战|动态规划-经典线性DP|最长上升子序列|合唱队形|最长公共子序列|编辑距离(C++)
经典线性dp问题有两个:最⻓上升⼦序列(简称:LIS)以及最⻓公共⼦序列(简称:LCS),这两道题⽬的很多⽅⾯都是可以作为经验,运⽤到别的题⽬中。⽐如:解题思路,定义状态表⽰的⽅式,推到状态转移⽅程的技巧等等。两个字符串之间的dp 问题,与最⻓公共⼦序列的分析⽅式类似。因此,这两道经典问题是⼀定需要掌握的。原创 2025-04-10 13:41:24 · 854 阅读 · 0 评论 -
NO.84十六届蓝桥杯备战|动态规划-路径类DP|矩阵的最小路径和|迷雾森林|过河卒|方格取数(C++)
路径类dp是线性dp的⼀种,它是在⼀个n×m的矩阵中设置⼀个⾏⾛规则,研究从起点⾛到终点的⽅案数、最⼩路径和或者最⼤路径和等等的问题。贪⼼+两次dp是错误的,因为两次最优不等于全局最优,可以举出反例。正解应该是同时去⾛两条路,两者相互影响,所以放在⼀起考虑。原创 2025-04-09 21:42:21 · 1628 阅读 · 2 评论 -
NO.83十六届蓝桥杯备战|动态规划-基础线性DP|台阶问题|最大子段和|传球游戏|乌龟棋(C++)
线性dp是动态规划问题中最基础、最常⻅的⼀类问题。它的特点是状态转移只依赖于前⼀个或前⼏个状态,状态之间的关系是线性的,通常可以⽤⼀维或者⼆维数组来存储状态。原创 2025-04-09 19:33:37 · 1091 阅读 · 0 评论 -
NO.82十六届蓝桥杯备战|动态规划-从记忆化搜索到动态规划|下楼梯|数字三角形(C++)
的值时,我们仅仅需要前三个格⼦的值,第i-4个及其之前的格⼦的值已经毫⽆⽤处了。因此,可以⽤三个变量记录i位置之前三个格⼦的值,然后在填完i位置的值之。需要注意,当⽤因为我们当前这个位置的值需要左上⻆位置的值,因此滚动数组优化的时候,要改变第⼆维的遍历顺序。我们发现,在填写第i ⾏的值时,我们仅仅需要前⼀⾏的值,并不需要第i - 2 以及之前⾏的值。因此,我们可以只⽤⼀个⼀维数组来记录上⼀⾏的结果,然后在这个数组上更新当前⾏的值。学习动态规划最经典的⼊⻔题。原创 2025-04-09 16:31:58 · 1381 阅读 · 0 评论 -
NO.81十六届蓝桥杯备战|数据结构-Trie树-字典树-前缀树|于是他错误的点名开始了|最大异或对 The XOR Largest Pair(C++)
字典树的概念Trie树⼜叫字典树或前缀树,是⼀种能够快速插⼊和查询字符串的数据结构。它利⽤字符串的公共前缀,将字符串组织成⼀棵树形结构,从⽽⼤⼤提⾼了存储以及查找效率。我们可以把字典树想象成⼀棵多叉树,每⼀条边代表⼀个字符,从根节点到某个节点的路径就代表了⼀个字符串。例如,要存储 “abc” 、 “abd” 、 “acde” 以及 “cd” 时,构建的字典树如下字典树的作⽤。原创 2025-04-09 14:03:52 · 593 阅读 · 0 评论 -
NO.80十六届蓝桥杯备战|数据结构-字符串哈希|兔子与兔子(C++)
【代码】NO.80十六届蓝桥杯备战|数据结构-字符串哈希|兔子与兔子(C++)原创 2025-04-09 10:20:50 · 1226 阅读 · 0 评论 -
NO.79十六届蓝桥杯备战|数据结构-扩展域并查集-带权并查集|团伙|食物链|银河英雄传说(C++)
把真话⾥⾯的相互关系,⽤"带权并查集"维护起来,权值表⽰当前节点相对于根节点的距离。针对x ,扩展三个域:同类域x,捕⻝域x+n,被捕⻝域x+n+n。原创 2025-04-08 21:09:22 · 797 阅读 · 0 评论 -
NO.78十六届蓝桥杯备战|数据结构-并查集|双亲表示法|初始化|查询|合并|判断|亲戚|Lake Counting|程序自动分析(C++)
在学习树这个数据结构的时,讲到树的存储⽅式有很多种:孩⼦表⽰法,双亲表⽰法、孩⼦双亲表⽰法以及孩⼦兄弟表⽰法等。对⼀棵树⽽⾔,除了根节点外,其余每个结点⼀定有且仅有⼀个双亲,双亲表⽰法就是根据这个特点存储树的,也就是把每个结点的双亲存下来。路径压缩:在查询时,把被查询的节点到根节点的路径上的所有节点的⽗节点设置为根节点,从⽽减⼩树的深度。并查集(UnionFind):是⼀种⽤于维护元素所属集合的数据结构,实现为⼀个森林,其中每棵树表⽰⼀个集合,树中的节点表⽰对应集合中的元素,根节点来代表整个集合。原创 2025-04-08 18:13:19 · 1015 阅读 · 0 评论 -
NO.77十六届蓝桥杯备战|数据结构-单调队列|质量检测(C++)
【代码】NO.77十六届蓝桥杯备战|数据结构-单调队列|质量检测(C++)原创 2025-04-08 15:18:18 · 403 阅读 · 0 评论 -
NO.76十六届蓝桥杯备战|数据结构-单调栈|发射站|Largest Rectangle in a Histogram(C++)
从右往左遍历元素,构造⼀个单调递减的栈。对于x位置⼦矩阵,找到左侧离它最近并且⽐它⼩的位置y ,那么。对于每⼀个⼦矩阵,求出它向左以及向右能延伸的最⼤⻓度即可。5. 寻找当前元素右侧,离它最近,并且⽐它⼤的元素在哪。同理再找到右侧离它最近并且⽐它⼩的位置z ,那么。针对其余两种情况,我们仅需逆序遍历数组即可。之间就是该矩阵能到达的左端。之间就是该矩阵能到达的右端。原创 2025-04-08 14:36:08 · 1060 阅读 · 0 评论 -
NO.75十六届蓝桥杯备战|搜索算法-多源BFS-01BFS-Floodfill矩阵距离|刺杀大使|小明的游戏|Three States|Lake Counting|填涂颜色
那么,在BFS的过程中,可以将边权为0扩展出来的点放到队⾸,边权为1扩展出来的点放到队尾。正难则反:直接找出被1包围的0是很困难的,因为很难确定当前搜索到的这个0是否是被包围的。但是,我们如果从边缘的0开始搜索,搜索到的0⼀定是没有被包围的。不同于普通的bfs问题,01bfs问题在遍历的过程中,如果遇到之前已经遍历过的结点,有可能会找到⼀条更优的路线。直接找答案显然是不现实的,因为能⾛的路径实在是太多了,如果全都枚举出来时间上吃不消。因此,我们可以从边缘的0开始搜索,标记所有与边缘0相连的联通块。原创 2025-04-08 11:11:55 · 774 阅读 · 0 评论 -
NO.74十六届蓝桥杯备战|搜索算法-BFS|马的遍历|迷宫|Catch That Cow|八数码难题(C++)
宽度优先搜索的过程中,每次都会从当前点向外扩展⼀层,所以会具有⼀个最短路的特性。因此,宽搜不仅能搜到所有的状态,⽽且还能找出起始状态距离某个状态的最⼩步数。当把整个迷宫全部搜索完毕之后,扫描整个标记数组,求出出⼝的数量以及最短的距离。经过之前那么多题的铺垫,这道题的解法还是容易想到的。因为要求的是最短步数,因此可以⽤bfs解决。但是,前提条件是每次扩展的代价都是1,或者都是相同的数。那就从起点开始,⼀层⼀层的往外搜,⽤⼀个dist 数组记录最短距离。距离起点等距离的⼀层,天然具有最短性。原创 2025-04-07 17:16:34 · 923 阅读 · 0 评论 -
NO.73十六届蓝桥杯备战|搜索算法-剪枝与优化-记忆化搜索|数的划分|小猫爬山|斐波那契数|Function|天下第一|滑雪(C++)
因此,可以在递归的过程中,把每次算出来的结果存在⼀张「备忘录」⾥⾯。等到下次递归进⼊「⼀模⼀样」的问题之后,就「不⽤傻乎乎的展开计算」,⽽是在「备忘录⾥⾯直接把结果拿出来」,起到⼤量剪枝的效果。在搜索的过程中,如果发现特别多完全相同的⼦问题,就可以添加⼀个备忘录,将搜索的结果放在备忘录中。因为测试数据是多组的,并且模数都是p,再加上递归的过程中会递归的相同的问题,所以可以把递归改写成记忆化搜索。剪枝,形象得看,就是剪掉搜索树的分⽀,从⽽减⼩搜索树的规模,排除掉搜索树中没有必要的分⽀,优化时间复杂度。原创 2025-04-07 15:18:16 · 968 阅读 · 0 评论 -
NO.72十六届蓝桥杯备战|搜索算法-DFS|选数|飞机降落|八皇后|数独(C++)
组合型枚举,路径⾥⾯记录选择数的「总和」。在选出k 个数之后,判断「是否是质数」枚举所有⻜机的「全排列」,判断是否存在⼀种排列,使的全部的⻜机都能安全降落。原创 2025-04-07 11:07:09 · 464 阅读 · 0 评论 -
NO.71十六届蓝桥杯备战|搜索算法-递归型枚举与回溯剪枝|枚举子集|组合型枚举|枚举排列|全排列问题(C++)
跟上⼀道题的决策⼀样,我们可以枚举每⼀位应该放上什么数,只不过少了k的限制。剪枝的策略还是⼀样的,那就是在路径中,「不能选择之前已经选过的数」设n = 3, k = 2 ,⼀共要选出两个数,可以依次「考虑要选出来的数」是谁,画出如下决策树。设⼀共有3个数,分别是1,2,3。「从前往后」考虑每⼀个数,针对当前这个数「选」或者「不选」设n = 4, m = 3 ,「从前往后」考虑3 个位置应该选哪个数,我们可以画出如下决策树。原创 2025-04-06 21:40:31 · 682 阅读 · 0 评论 -
NO.70十六届蓝桥杯备战|基础算法-分治|逆序对|求第k小的数|最大子段和|地毯填补问题(C++)
⼀维分治的时候,我们是从中间把整个区间切开,分成左右两部分(其实有时候我们可以三等分,就看具体问题是什么)。当我们把整个区间按照中⼼点⼀分为四后,四个区间⾥⾯必然有⼀个区间有缺⼝(就是公主的位置),那这四个区间不⼀样,那就没有相同⼦问题了。分治,字⾯上的解释是「分⽽治之」,就是把⼀个复杂的问题分成两个或更多的相同的⼦问题,直到最后⼦问题可以简单的直接求解,原问题的解即⼦问题的解的合并。,我们可以通过计算每⼀个区间内元素的「个数」,进⽽推断出我们要找的元素是在「哪⼀个区间」⾥⾯。原创 2025-04-06 20:05:58 · 862 阅读 · 0 评论 -
NO.69十六届蓝桥杯备战|基础算法-递归初阶|汉诺塔问题|占卜DIY|FBI树(C++)
处理主问题时,需要解决⼦问题,两者的处理⽅式完全⼀致。 问题->相同的⼦问题->相同的⼦⼦问题......直到⼦问题不能继续拆分原创 2025-04-06 16:25:51 · 790 阅读 · 0 评论 -
NO.68十六届蓝桥杯备战|基础算法-离散化|火烧赤壁|贴海报(C++)
此时如果需要⽤数据的值来映射数组的下标时,就可以⽤离散化的思想先预处理⼀下所有的数据,使得每⼀个数据都映射成⼀个较⼩的值。由于「区间的⻓度」很⼤,暴⼒模拟的时候会超时。但是我们发现,虽然区间⻓度很⼤,但是「区间的个数」是很少的,所以我们可以「离散化」处理⼀下区间的端点值,然后在「离散化的基础上」模拟覆盖情况。在涉及「区间覆盖」问题上,离散化会导致「结果出错」。此时「单个区间内部」就出现空隙,「区间与区间之间」也会出现空。可⻅,离散化之后可能会导致结果错误,使⽤的时候还是需要「谨慎」⼀点。原创 2025-04-06 13:58:37 · 508 阅读 · 0 评论 -
NO.67十六届蓝桥杯备战|基础算法-倍增思想|快速幂|快速乘法(C++)
倍增,顾名思义就是翻倍。它能够使线性的处理转化为对数级的处理,极⼤地优化时间复杂度。跟「快速幂」的思想⼀致,我们通过⼀个具体的例⼦模拟⼀下算法的流程,⽐如3 × 11。利⽤「⼆进制」以及「倍增」的思想,通过⼀个具体的例⼦说明,⽐如。其实很简单,从前往后看,后⼀个数是前⼀个数的平⽅。只需将11的⼆进制表⽰中1 所对应的幂乘起来即可。如何实现这个算法呢,以a × b 为例。如何实现这个算法,以。原创 2025-04-06 10:49:58 · 738 阅读 · 0 评论 -
NO.66十六届蓝桥杯备战|基础算法-贪心-区间问题|凌乱的yyy|Rader Installation|Sunscreen|牛栏预定(C++)
按照区间「左端点从⼩到⼤」排序,当两个区间「重叠」的时候,为了后⾯能够「尽可能多的选出互相重叠的区间」,我们应该把「区间范围较⼤」的区间移除,因为选择较⼤区间会造成选出来的区间「不是互相重叠」的。从前往后依次⽐较「贪⼼解」和「最优解」针对每⼀个区间的决策,当找到第⼀个区间,它们的「分配决策不同」时:设贪⼼解⽤的是a防晒霜,最优解⽤的是b防晒霜,因为贪⼼解选的是最⼩的,所以有。为了能够「在移除某个区间后,保留更多的区间」,我们应该把「区间范围较⼤」的区间移除。第一个区间选了a之后,b这个点就没办法分配了。原创 2025-04-05 22:42:49 · 786 阅读 · 0 评论 -
NO.65十六届蓝桥杯备战|基础算法-贪心推公式排序|哈夫曼编码|拼数|奶牛玩杂技|哈夫曼编码|合并果子(C++)
利⽤排序解决问题,最重要的就是需要证明"在新的排序规则下,整个集合可以排序"。但是证明过程很⿇烦,后续题⽬中我们只要发现该题最终结果需要排序,并且交换相邻两个元素的时候,对其余元素不会产⽣影响,那么我们就可以推导出排序的规则,然后直接去排序,就不去证明了。在解决某些问题的时,当我们发现最终结果需要调整每个对象的先后顺序,也就是对整个对象排序时,那么我们就可以⽤推公式的⽅式,得出我们的排序规则,进⽽对整个对象排序。从树的根到任意结点的路径⻓度与该结点上权值的乘积,称为该结点的带权路径⻓度。原创 2025-04-05 14:47:11 · 599 阅读 · 0 评论 -
NO.64十六届蓝桥杯备战|基础算法-简单贪心|货仓选址|最大子段和|纪念品分组|排座椅|矩阵消除(C++)
贪⼼算法,或者说是贪⼼策略:企图⽤局部最优找出全局最优。把解决问题的过程分成若⼲步;解决每⼀步时,都选择"当前看起来最优的"解法;"希望"得到全局的最优解。原创 2025-04-04 18:31:59 · 1811 阅读 · 0 评论 -
NO.63十六届蓝桥杯备战|基础算法-⼆分答案|木材加工|砍树|跳石头(C++)
⼆分答案可以处理⼤部分「最⼤值最⼩」以及「最⼩值最⼤」的问题。如果「解空间」在从⼩到⼤的「变化」过程中,「判断」答案的结果出现「⼆段性」,此时我们就可以「⼆分」这个「解空间」,通过「判断」,找出最优解。设每次跳的最短距离是x ,移⾛的⽯头块数为c。设要切成的⻓度为x ,能切成的段数为c。设伐⽊机的⾼度为H ,能得到的⽊材为C。这个「⼆分答案」的原理其实很容易理解,重点是如何去「判断」答案的可⾏性。c表示在h的基础下,所能获得的木材。c表示在x的基础下,移走岩石的数目。x表示切割出来的小段的长度。原创 2025-04-03 20:09:22 · 1239 阅读 · 0 评论 -
NO.62十六届蓝桥杯备战|基础算法-二分查找|查找元素的第一个和最后一个位置|牛可乐和魔法封印|A-B数对|烦恼的高考意愿(C++)
⼆分算法是我觉得在基础算法篇章中最难的算法。⼆分算法的原理以及模板其实是很简单的,主要的难点在于问题中的各种各样的细节问题。因此,⼤多数情况下,只是背会⼆分模板并不能解决题⽬,还要去处理各种乱七⼋糟的边界问题。原创 2025-04-03 15:22:55 · 962 阅读 · 0 评论 -
NO.61十六届蓝桥杯备战|基础算法-双指针|唯一的雪花|逛画展|字符串|丢手绢(C++)
当我们「暴⼒枚举」的过程中,固定⼀个起点位置left ,然后right之后向后遍历时。当我们「暴⼒枚举」的过程中,固定⼀个起点位置left,然后right之后向后遍历时。当我们「暴⼒枚举」的过程中,固定⼀个起点位置left ,然后right之后向后遍历时,记k为。当我们「暴⼒枚举」的过程中,固定⼀个起点位置left ,然后right之后向后遍历时。在一个数组中,选择一个最长连续的区域,所有的元素都不相同。借助哈希表判断枚举的子数组中,所有的元素都不相同。第⼀次扫描到⼀个位置,使。⼀次扫描到⼀个位置,使。原创 2025-04-02 19:10:05 · 883 阅读 · 0 评论 -
NO.60十六届蓝桥杯备战|基础算法-差分|一维差分|海底高铁|二维差分|地毯(C++)
解法2:利用差分数组解决问题,快速解决将某一个区间所有元素统一加上一个数的操作差分模板题,先「创建」差分数组,然后根据差分数组的「性质」处理q次区间修改,最后「还原」出来原始的数组。⼆维差分模板题,先根据差分矩阵的「性质」创建差分矩阵,然后根据差分矩阵的「性质」处理q次区间修改,最后利⽤「前缀和」还原出来原始的矩阵。因此,重点就是差分矩阵的「性质」。前缀和与差分的核⼼思想是预处理,可以在暴⼒枚举的过程中,快速给出查询的结果,从⽽优化时间复杂度。差分数组fi表示:原数组第i项与第i-1项的差值。原创 2025-03-30 17:40:17 · 979 阅读 · 0 评论