- 博客(94)
- 收藏
- 关注
原创 贪心-试填法
试填法可以理解为贪心在数位上的具体应用,我们如果想要一个整体最大的数,那么我们没有必要让这个数每一位是最大的,我们只需要让这个数的最高位最大就可以了,如果两个数的最高位相同,那么我们就需要找次高位最大的,以此类推。这道题具体的实现方法是每次遍历每个(被标记为 1 的)数的最高位(第bit位),如果有满足条件的一组数(cnt.size() >= n)那么把这一组数标记为 1 ,并把最高位加到答案中,这样以来我们就保证总和最大。
2025-10-31 21:31:44
333
原创 背包问题从入门到入土
后面三个背包问题的基础我在这里介绍4种常见的背包问题,这里我想按易 --> 难程度从01背包,完全背包,分组背包,多重背包的顺序介绍。封面附在最后。
2025-09-12 21:53:15
717
3
原创 最小生成树从入门到入土
首先介绍一下最常用最小生成树模板,以边为主体,每次选取最小的边加入最小生成树,总共选取n-1条边,最后若 cnt < n - 1 说明原图有至少两个独立连通分量。
2025-09-10 17:02:01
608
1
原创 超好用的数论基础,妈妈再也不怕我做不出来数论打卡题了
这没什么好说的,每当遇到一个素数,筛掉它所有的倍数唯一要注意一个小优化 for (int j = i * i;j <= n;本来应该是 for (int j = 2 * i;j <= n;j += i) 但是 2 * i 到 i * i 之间的 j 已经被筛过一遍了。
2025-08-12 10:45:43
582
1
原创 从BFS到负权图薄纱最短路问题
我认为BFS层次最短路最关键的特征有两个,首先是层次(通过队列先入先出的特征来实现),其次是边权为1,如果边权不是1的话那么同样走一步就会有的步伐大有的步伐小,根本无法判断那条路最短。
2025-08-11 21:57:11
501
1
原创 用递归实现各种排列
这个枚举与前两个不同,因为是排列的枚举,所以不要求字典序输出,因此问题转换成了如何避免重复,所以我专门开了一个状态数组来记录这个数位上要取的值是否已经被取过了。注释的部分是递归的剪枝操作,避免过早取到太大的值导致后面的值无法取,加上剪枝还是能省不少时间的。为了满足字典序的输出,我采用了逐位递归的方法(每一位的所能取到的最小值都大于前一位)
2025-05-08 23:35:51
289
1
原创 单调队列模板
如果用暴力法,每一次窗口的滑动都要比较k个元素,复杂度为O(nk),而用单调队列的数据结构每个元素都至多入队一次,出队一次,复杂度为O(n)。
2025-02-10 21:54:59
142
原创 链表:从基本实现到间接实现(以环形链表为例)
这里需要注意的是在进行删除节点等操作时,头结点的存在会大大优化线型链表的逻辑结构,而对于环形链表,头结点的存在就显得可有可无了,但习惯上我们依旧在初始化链表时设立头结点。
2025-01-31 15:31:30
131
原创 BFS最短路径问题模板题
在涉及最短路径问题时,应该在不断向外遍历时多加一个记录遍历层数的变量(上题用的时step);如果说DFS是一条在地图上的贪吃蛇,一条道走到黑,直到走不通再return回去直到能走通,那么BFS就是以起点为中心不断向外扩散的水波一层层地向外蔓延。
2024-12-20 22:32:46
265
原创 DFS/BFS 模板题 (迷宫题)
但在涉及最优解时BFS很有用,因为在BFS中,你可以使用队列来存储待搜索的节点。起始点首先加入队列中,然后不断从队列中取出节点,检查它是否是目标节点。如果不是,就将它的所有未被访问过的邻居加入队列中。这样,队列中的节点总是按照它们距离起点的距离排序,先加入队列的节点总是先被取出来搜索。这种题首选DFS 非常直观从起点开始搜索,不走回头路。BFS(广度优先)在这道题里不是很方便。
2024-12-19 20:36:15
241
原创 算法/C++ STL排列&手动可选择排列
简单明了,全靠 next/prev_permutation 函数,这是一个非常好用的排序函数,但无法进行剪枝的操作,即在明知当前排列已经错误时无法停止,会导致超时。这里没有具体的例子大致是满足一个具体的条件后return结束递归。这是就需要我们手写一个排列函数。
2024-11-28 22:12:43
488
原创 算法 用ST算法解决RMQ(区间最值问题)
再接下来 q 行,每行两个整数 l 和 r,表示询问第 l 个数到第 r 个数内最大值和最小值的差。接下来 n 行,每行一个数 ni。第一行两个数 n,q。
2024-11-20 14:00:34
166
原创 算法 二分法查找的利弊
正常的查找肯定是要遍历一整个数组的,因为每一个数都可能是你要找的数,但二分查找可以通过不断更新边界来确定范围做到非常快,这种做法的思想性很好,但个人感觉实用性不好,因为使用二分法的前提是数组已经排好序了,如果遇到无序的数组,只能先排序再查找,可如果你先排好了序,那么你查找本身就失去意义了,因为待查找数本身的位置很可能已经被排序所改变了,所以真正的应用场景中,直接用find函数会更好。
2024-11-19 21:37:25
203
原创 CPP STL substr 与 copy,以复制小数的整数部分与小数部分为例
copy虽然无法达到push_back的效果但可以应用于各种类型的动态数组中。通过构造string函数直接提取整数部分与小数部分。这里substr的作用是提取,是有一个返回值的。这里还可以再简便一点省去计算索引的过程。
2024-11-13 13:06:48
282
原创 C++算法 查找一个字符串或整数或小数中任意一个元素的索引(位置)
这个算法的高明之处在于不仅语言量很少,而且无论输入的是什么,有多长,都可以查找到其中的特定元素。以下这个例子是查找若干个小数中小数点的索引。
2024-11-10 21:55:05
416
空空如也
一道入门算法题,思路感觉没问题鸭
2024-09-23
第一天学C语言hello word写不出来
2024-08-27
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅