- 博客(89)
- 收藏
- 关注
原创 [C++][算法基础]贪心应用问题合集
在一个果园里,达达已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆。达达决定把所有的果子合成一堆。每一次合并,达达可以把两堆果子合并到一起,消耗的体力等于两堆果子的重量之和。可以看出,所有的果子经过 𝑛−1 次合并之后,就只剩下一堆了。达达在合并果子时总共消耗的体力等于每次合并所耗体力之和。因为还要花大力气把这些果子搬回家,所以达达在合并果子时要尽可能地节省体力。
2024-04-29 20:26:03
1300
原创 [C++][算法基础]区间覆盖(贪心 + 区间问题4)
给定 𝑁 个闭区间 [𝑎𝑖,𝑏𝑖] 以及一个线段区间 [𝑠,𝑡],请你选择尽量少的区间,将指定线段区间完全覆盖。输出最少区间数,如果无法完全覆盖则输出 −1。
2024-04-28 21:47:39
342
原创 [C++][算法基础]区间分组(贪心 + 区间问题3)
给定 𝑁 个闭区间 [𝑎𝑖,𝑏𝑖],请你将这些区间分成若干组,使得每组内部的区间两两之间(包括端点)没有交集,并使得组数尽可能小。输出最小组数。
2024-04-28 21:45:04
242
原创 [C++][算法基础]最大不相交区间数量(贪心 + 区间问题2)
给定 𝑁 个闭区间 [𝑎𝑖,𝑏𝑖],请你在数轴上选择若干区间,使得选中的区间之间互不相交(包括端点)。输出可选取区间的最大数量。
2024-04-28 21:43:36
289
原创 [C++][算法基础]区间选点(贪心 + 区间问题1)
给定 𝑁 个闭区间 [𝑎𝑖,𝑏𝑖],请你在数轴上选择尽量少的点,使得每个区间内至少包含一个选出的点。输出选择的点的最小数量。位于区间端点上的点也算作区间内。
2024-04-28 21:41:56
221
原创 [C++][算法基础]滑雪(记忆化搜索 / 递归)
给定一个 𝑅 行 𝐶 列的矩阵,表示一个矩形网格滑雪场。矩阵中第 𝑖 行第 𝑗 列的点表示滑雪场的第 𝑖 行第 𝑗 列区域的高度。一个人从滑雪场中的某个区域内出发,每次可以向上下左右任意一个方向滑动一个单位距离。当然,一个人能够滑动到某相邻区域的前提是该区域的高度低于自己目前所在区域的高度。在给定矩阵中,一条可行的滑行轨迹为 24−17−2−1。在给定矩阵中,最长的滑行轨迹为 25−24−23−…−3−2−1,沿途共经过 25 个区域。
2024-04-28 16:03:15
199
原创 [C++][算法基础]没有上司的舞会(树形动态规划)
Ural 大学有 N𝑁 名职员,编号为 1∼𝑁。他们的关系就像一棵以校长为根的树,父节点就是子节点的直接上司。每个职员有一个快乐指数,用整数 𝐻𝑖 给出,其中 1≤𝑖≤𝑁。现在要召开一场周年庆宴会,不过,没有职员愿意和直接上司一起参会。在满足这个条件的前提下,主办方希望邀请一部分职员参会,使得所有参会职员的快乐指数总和最大,求这个最大值。
2024-04-28 16:01:24
206
原创 [C++][算法基础]最短汉密尔顿路径(状态压缩动态规划)
给定一张 𝑛 个点的带权无向图,点从 0∼𝑛−1 标号,求起点 0 到终点 𝑛−1 的最短 Hamilton 路径。Hamilton 路径的定义是从 0 到 𝑛−1 不重不漏地经过每个点恰好一次。
2024-04-28 15:59:35
234
原创 [C++][算法基础]蒙特里安的梦想(状态压缩动态规划)
求把 𝑁×𝑀 的棋盘分割成若干个 1×2 的长方形,有多少种方案。例如当 𝑁=2,𝑀=4 时,共有 5 种方案。当 𝑁=2,𝑀=3 时,共有 3 种方案。
2024-04-28 15:57:33
141
原创 [C++][算法基础]计数问题(数位统计动态规划)
给定两个整数 𝑎 和 𝑏,求 𝑎 和 𝑏 之间的所有数字中 0∼9 的出现次数。其中0出现 10 次,1出现 10 次,2出现 7 次,3出现 3 次等等…
2024-04-28 15:55:21
196
原创 [C++][算法基础]整数划分(统计动态规划)
一个正整数 𝑛 可以表示成若干个正整数之和,形如:𝑛=𝑛1+𝑛2+…+𝑛𝑘,其中 𝑛1≥𝑛2≥…≥𝑛𝑘,𝑘≥1。我们将这样的一种表示称为正整数 𝑛 的一种划分。现在给定一个正整数 𝑛,请你求出 𝑛 共有多少种不同的划分方法。
2024-04-28 15:52:35
395
原创 [C++][算法基础]石子合并(区间动态规划)
设有 𝑁 堆石子排成一排,其编号为 1,2,3,…,𝑁。每堆石子有一定的质量,可以用一个整数来描述,现在要将这 𝑁 堆石子合并成为一堆。每次只能合并相邻的两堆,合并的代价为这两堆石子的质量之和,合并后与这两堆石子相邻的石子将和新堆相邻,合并时由于选择的顺序不同,合并的总代价也不相同。例如有 4 堆石子分别为1 3 5 2, 我们可以先合并 1、2 堆,代价为 4,得到4 5 2, 又合并 1、2 堆,代价为 9,得到9 2,再合并得到 11,总代价为 4+9+11=24;
2024-04-28 15:42:30
246
原创 [C++][算法基础]最长公共子序列(动态规划)
给定两个长度分别为 𝑁 和 𝑀 的字符串 𝐴 和 𝐵,求既是 𝐴 的子序列又是 𝐵 的子序列的字符串长度最长是多少。
2024-04-26 20:41:01
256
原创 [C++][算法基础]最长上升子序列(动态规划 / 贪心 + 二分)
1. 数据量较小情况下:动态规划给定一个长度为 𝑁 的数列,求数值严格单调递增的子序列的长度最长是多少。
2024-04-26 20:39:20
361
原创 [C++][算法基础]数字三角形(动态规划)
给定一个如下图所示的数字三角形,从顶部出发,在每一结点可以选择移动至其左下方的结点或移动至其右下方的结点,一直走到底层,要求找出一条路径,使路径上的数字的和最大。
2024-04-26 20:36:16
287
原创 [C++][算法基础]四种基本背包问题(动态规划)
有 𝑁 组物品和一个容量是 𝑉 的背包。每组物品有若干个,同一组内的物品最多只能选一个。每件物品的体积是,价值是,其中 𝑖 是组号,𝑗 是组内编号。求解将哪些物品装入背包,可使物品总体积不超过背包容量,且总价值最大。输出最大价值。
2024-04-25 23:15:19
1257
原创 [C++][算法基础]解异或线性方程组(高斯消元)
输入一个包含 𝑛 个方程 𝑛 个未知数的异或线性方程组。方程组中的系数和常数为 0 或 1,每个未知数的取值也为 0 或 1。求解这个方程组。其中表示异或(𝑋𝑂𝑅),𝑀[𝑖][𝑗] 表示第 𝑖 个式子中 𝑥[𝑗] 的系数,𝐵[𝑖] 是第 𝑖 个方程右端的常数,取值均为 0 或 1。
2024-04-24 22:50:36
158
原创 [C++][算法基础]四种基本Nim游戏(博弈论)
给定 𝑛 堆石子,两位玩家轮流操作,每次操作可以取走其中的一堆石子,然后放入两堆的石子(新堆规模可以为 0,且两个新堆的石子总数可以大于取走的那堆石子数),最后无法进行操作的人视为失败。问如果两人都采用最优策略,先手是否必胜。
2024-04-24 19:50:18
623
原创 [C++][算法基础]能被整除的数(容斥原理)
给定一个整数 𝑛 和 𝑚 个不同的质数 𝑝1,𝑝2,…,𝑝𝑚。请你求出 1∼𝑛 中能被 𝑝1,𝑝2,…,𝑝𝑚 中的至少一个数整除的整数有多少个。
2024-04-24 01:08:09
514
原创 [C++][算法基础]线性同余方程(扩展欧几里得算法)
给定 𝑛 组数据 𝑎𝑖,𝑏𝑖,𝑚𝑖,对于每组数求出一个 𝑥𝑖,使其满足 𝑎𝑖×𝑥𝑖 ≡ 𝑏𝑖(mod𝑚𝑖),如果无解则输出impossible。
2024-04-21 16:46:19
273
原创 [C++][算法基础]扩展欧几里得算法
给定 𝑛 对正整数 𝑎𝑖,𝑏𝑖,对于每对数,求出一组 𝑥𝑖,𝑦𝑖,使其满足 𝑎𝑖×𝑥𝑖+𝑏𝑖×𝑦𝑖=𝑔𝑐𝑑(𝑎𝑖,𝑏𝑖)。
2024-04-21 16:44:08
275
原创 [C++][算法基础]求乘法逆元(快速幂)
若整数 b,m 互质,并且对于任意的整数 a,如果满足 b|a,则存在一个整数 x,使得,则称 x 为 b 的模 m 乘法逆元,记为。b 存在乘法逆元的充要条件是 b 与模数 m 互质。当模数 m 为质数时,即为 b 的乘法逆元。
2024-04-20 17:31:48
394
原创 [C++][算法基础]欧拉函数(常规求质数)
1∼N 中与 N 互质的数的个数被称为欧拉函数,记为 ϕ(N)。若在算数基本定理中,N=,则:ϕ(N) = N×××…×。
2024-04-19 21:33:51
220
转载 [C++][算法基础]二分图的最大匹配(匈牙利算法)
给定一个二分图,其中左半部包含 n1 个点(编号 1∼n1),右半部包含 n2 个点(编号 1∼n2),二分图共包含 m 条边。数据保证任意一条边的两个端点都不可能在同一部分中。请你求出二分图的最大匹配数。二分图的匹配:给定一个二分图 G,在 G 的一个子图 M 中,M 的边集 {E} 中的任意两条边都不依附于同一个顶点,则称 M 是一个匹配。二分图的最大匹配:所有匹配中包含边数最多的一组匹配被称为二分图的最大匹配,其边数即为最大匹配数。
2024-04-16 20:47:33
223
原创 [C++][算法基础]求最小生成树(Kruskal)
给定一个 n 个点 m 条边的无向图,图中可能存在重边和自环,边权可能为负数。求最小生成树的树边权重之和,如果最小生成树不存在则输出impossible。给定一张边带权的无向图 G=(V,E),其中 V 表示图中点的集合,E 表示图中边的集合,n=|V|,m=|E|。由 V 中的全部 n 个顶点和 E 中 n−1 条边构成的无向连通子图被称为 G 的一棵生成树,其中边的权值之和最小的生成树被称为无向图 G 的最小生成树。
2024-04-15 15:14:21
278
原创 [C++][算法基础]求最小生成树(Prim)
给定一个 n 个点 m 条边的无向图,图中可能存在重边和自环,边权可能为负数。求最小生成树的树边权重之和,如果最小生成树不存在则输出impossible。给定一张边带权的无向图 G=(V,E),其中 V 表示图中点的集合,E 表示图中边的集合,n=|V|,m=|E|。由 V 中的全部 n 个顶点和 E 中 n−1 条边构成的无向连通子图被称为 G 的一棵生成树,其中边的权值之和最小的生成树被称为无向图 G 的最小生成树。
2024-04-15 15:12:08
273
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人