- 博客(34)
- 收藏
- 关注
原创 背包问题总结
因为要保留每一次更新状态时的方案,也就是第一层循环的 i ,所以我们就不能把dp数组进行一维优化了。因为我们要求的是字典序最小的一个方案。肯定是想要dp保留第一个满足的方案。因为dp取max时会实时更新的,也就是说,当前面的和后面的数都满足条件时,dp会保留后面的值。dp问题最重要的是状态转移方程。表示前 i 个物品,背包容量不超过 j 时的最大价值。保留的就是最先满足的方案(也就保证了字典序最小),这一点和01背包是有点像的,下面给出代码及优化。那么我们按照套路,写一下。来求得(因为项数不同)。
2024-03-22 15:34:33
476
原创 图论复习(最短路、最小生成树)
在建图时,记录每个节点的入度,首先把入度为0的点都存到队列里。然后在搜索时,每搜到一个点,就把这个点的入度 -1 ,当它的入度变为0时,就把它存到队列里。直到队列里全部的点都搜索完。这时要判断一下是否所有的点的入度都为0了。如果是,那么就找到了一个拓扑序列;否则就没有找到。
2024-03-18 17:51:31
2532
原创 第十四次CCF-CSP(第二题 买菜、第四题 再卖菜)
因为所有的区间值都在1e6之内。所以我们可以把区间内的所有值(半闭半开区间!)映射到一条长的线段上去。当出现了区间内的值,就 + 1,所以我们只需要在该线段上找到值为 2 的个数即可。因为题目要求 [s,t] 的长度为 t - s。并不是 t - s + 1。所以我们只需要在预处理的时候,少映射一位数即可。简单来说,就是给出两组区间的集合A,B 求出两集合中相交区间的部分的长度,算法跑一遍(因为有负数),求。建好图之后,只需要用。
2024-03-15 15:21:32
392
原创 第十一次CCF-CSP(第二题 公共钥匙盒、第四题 通信网络)
使用数组模拟邻接表时,一定要记得给h[]初始化为 -1!!!!同时建立正向和反向 两个图时,只需要建立两个不同的头结点数组h[]就行了。对于边的数量 M,保险起见,要设置为题目规定大小的 2倍!idx表示序号,大小并不重要。
2024-03-15 15:18:18
498
原创 第十三次CCF-CSP (URL映射、棋局评估)
等不重要的字符,然后再存放到结构体中。由题可知,规则的名称和结果是一一对应的,所以我们可以建立一个结构体来存储所有的规则。虽然官网上面可以100分,但是acwing上还是有一个测试样例过不去…在输出结果时,因为如果规则中出现了 类似于正则式的情况(比如。” 可知,这是一道博弈题,博弈简单来说就是每个人都会想方设法。就表示所有整数),这时应该把查询中对应位置的字符串输出。字符被去掉了,我们没有一个合适的字符作为分割符!我本来想的是,把所有的规则先处理好:去掉。接下来要考虑如何处理这些规则了。
2024-03-14 20:35:40
612
原创 第十二次CCF-CSP(Crontab、行车路线)
通过这道大模拟题,我学到了很多巧妙的方法。stoi(s)可以把字符串 s 直接转换为整数!tolower(c)可以把字符 c 转为小写toupper(c)把字符 c 转为大写结构体构建的巧妙!!!bool数组的巧妙利用!!!哈希表的映射!!!y总nb!!!对于优先队列,不能只会用它默认的形式,还有会把它和结构体结合起来。下面代码的意思是,构造一个优先队列 q ,其中按照 z 值的大小,从小到大排序!!!因为优先队列默认是大根堆!所以重载 < 时,return >才会是从小到大排序!
2024-03-11 21:37:13
712
原创 第十次CCF-CSP(Markdown、地铁修建)
对于题意:假设修建地铁最少需要 mid 天,若在所有施工公司中修建天数小于 mid 天的公司中选取 1–n 个公司,可以使得节点1和节点n连通。所以我们可以写两个函数,一个处理区块,一个处理区块中的每一行。所以本题本质上是考察二分和BFS(最短路问题)。给定一个无向图,有n个节点,m条边。(最大的最小—可以联想到二分)则此时的mid符合题意。输入数据不知道怎么处理。怎么找到每一个区块?强调中 嵌套超级链接。超级链接中 嵌套强调。
2024-03-10 17:14:39
1211
原创 刷题日记 2024_2_26
输入数据的小技巧substr的用法substr(a,b) 表示从字符串下标a开始截取b个substr(a) 表示从字符串下标a开始全部截取在for循环中j--, k++)和j--, k++)不一样!!!因为:在这个循环中,是循环继续执行的条件。这里使用了逗号操作符,这意味着j > 0这个表达式会被执行,但它的结果不会用来决定循环是否继续。循环继续执行的唯一条件是。逗号操作符允许在一个表达式的位置执行多个表达式,但只有最后一个表达式的结果会被用于逻辑判断。
2024-02-26 17:04:14
337
原创 刷题日记 2024_2_3
再回到题目中来,对于下面的输入数据又该怎么处理呢?(要怎么把抽象的符号和步数(整型)联系起来?由题可知,斜线代表电路。首先要明确一点:图中格子的坐标和点的坐标是不一样的。(可以用dijkstra的算法解决)以及格子的关系如下:(按照。那么问题就转化为了,
2024-02-03 16:43:56
370
原创 刷题日记 2024_2_2
简单来说,这道题是也是bfs的搜索题。跟模板题不太一样的地方是,这道题不是搜索二维矩阵上某两点或多点之间的距离,而是某种状态到另一种状态之间的“距离”,且要打印输出具体过程。所以需要利用不同的数据结构来存储中间不同的状态。这道题虽然思路不难,但是代码实现还是有点复杂,尤其是没有想到这种巧妙的数据结构之前。到这里基本的代码都已经解决了,还有最后一个问题:怎么打印输出操作序列?为了方便我们可以把2*4的魔板用一位字符串来表示。
2024-02-02 21:40:53
385
原创 刷题日记 2024_1_31(2)
这道题整体思路也比较清晰,但是实现起来有一个比较坑的点:bfs的时候,这道题整体思路也比较清晰,但是实现起来有一个比较坑的点:bfs的时候,还有,如果整个矩阵是一个连通块,那么这个既是山谷又是山峰。所以,我们需要在找连通块的同时,比较这个连通块和周围的大小。分别用来统计连通块周围的比它小的,和比它大的数的个数。应该放在比较大小的那段代码的下面!我的思路是,设置两个变量。这段代码应该放到哪里?这段代码应该放到哪里?
2024-01-31 20:01:14
336
原创 刷题日记 2024_1_31
不难看出,这道题其实也是一个求连通块的问题。比较不同的点是这个题目的输入数据稍微复杂一点。每一个元素代表一个房间四周墙的分布情况((因为x表示行方向,y表示列方向,所以当dx=0,dy=1时,坐标会往左移一位,也就是往西移动))由此可以看出,我们可以利用二进制数的思想,来判断一个房间四周是否有墙(是否连通)。数组的顺序也随之确定了。(dx,dy数组是表示某元素的相邻的四个方向的元素)我们按照题目上给出的顺序来(0123 分别代表西北东南)。如果是1 就说明 这个方向是有墙的,0就说明没有墙。
2024-01-31 15:06:27
321
原创 刷题日记 2024_1_30
容易看出,这是一道搜索题,题目要求是找到连通块的个数。由于是8连通的,所以对于每一个点,可以向8个方向遍历。所以,整体思路就是:用两重循环遍历字符矩阵,然后对于每一个字符,如果是’W’且没有被遍历过,就以它为起点使用。搜索算法进行搜索,最后计数器cnt++,即找到了一个连通块。
2024-01-30 22:58:27
156
1
原创 导弹防御系统——dfs+最长上升子序列思想
读题之后可以发现,该题并不能简单的套模板就能解决的。因为对于每一个元素,是把它放在当前的上升子序列中 还是下降子序列中,是不确定的。所以,只能都试一试,也就是爆搜。
2023-05-07 16:56:16
112
原创 拦截导弹(DP-最长上升子序列 + 狄尔沃斯定理)
中元素的数目必等于最小链划分中链的数目。此定理的对偶形式亦真,它断言:对于任意有限偏序集,其最长链中元素的数目必等于其最小反链划分中反链的数目。原话为:对于任意有限。
2023-05-07 16:55:42
85
原创 登山(DP问题-最长上升子序列)
那么,我们可以利用dp的思想,求得把每个点看做拐点所能得到的最长子序列,然后求出最大值即可。给定一数组,需要找出最长的子序列,该子序列满足(也就是说,我们可以分别求出,
2023-04-13 11:10:59
94
原创 飞机降落(dfs+贪心思想)
利用全排列的思想,对所有的线段进行搜索(首先解释一下,为什么不能直接贪心来做?,使得每条线段都不相交!需要我们来判断是否可以。那么要怎么dfs呢?
2023-04-13 10:58:36
164
原创 方格取数(DP问题)
那么,我们就可以用一个三维的dp数组来表示A,B每个时刻的坐标!因为,第一次走为局部最优并且也对第二次走造成了影响。不具备“无后效性”,因此分开两次走并不是全局最优解。所以,第二次走是在第一次影响下所能走的局部最优,为什么不能用贪心的思想?既然不能分开走,那么我们就要让。怎么保证 A , B 同时走?假设某一时刻A,B坐标分别为。易知,A,B的纵坐标分别为。(假设有两个人A,B)表示某时刻A的横坐标,表示已经走过的路程,
2023-04-13 10:33:00
78
原创 车站分级——拓扑排序的应用(虚拟节点)
简单来说就是,左边一堆结点,都指向右边的一堆结点,那么肯定有n*m条边,那我们不妨在它们中间加上一个虚拟结点,作为“中转点”,左边的结点通过指向中转点,再指向右边的点!原题链接:https://www.acwing.com/problem/content/458/注意,由于权重不能变,所以不妨设,左边指向虚拟节点的权重为0,虚拟结点指向右边的权重为1。拓扑排序之后,我们可以确定,数组top中,前面的元素车站级别肯定小于等于后面的。,也就是说,可以建立一个大小关系,而这个大小关系是一个有向无环图!
2023-03-31 00:14:37
158
原创 Trie树 之 异或的应用
原题链接:https://www.acwing.com/problem/content/145/,暴力的做法肯定会超时的,我们想到可以尝试trie树(若不明白Trie树的概念,先去学一下~)100005。
2023-03-31 00:11:05
54
原创 笨拙的手指——哈希思想
最后对三进制数利用同样的思路,枚举判断,如果得到的十进制数,已经出现过,那么就输出"Yes",否则"No"(注意如果原来没有前导零,那么我们不能修改为含有前导零的情况!),然后利用哈希表,存下来所有出现的情况。重点代码:怎么把b进制数转换为十进制数?先对二进制数的每一位进行枚举判断。
2023-03-23 12:42:02
51
原创 滑动窗口——单调队列
那么 a[i]与它后面的元素相比,一定不是最小值。也就是说,不妨直接把 a[i] 给删掉。分析可知,对于找滑动窗口的最小值而言,如果 a[i]>a[j] (i
2023-03-23 12:40:24
131
原创 小猫爬山——dfs+优化
==当某一次的搜索之中,发现此时的num 已经比 之前搜索结束时的num 要大了==,那么就可以直接return!首先,我们知道,对每一个小猫而言,要么坐目前已经有的k辆缆车(缆车的重量之和没有超过w),要么就再买一个新的缆车(超过了w)。又因为我们对每个小猫,都要对目前已有的车进行遍历搜索,所以我们还需要一个变量num,表示目前已经有了几个缆车(也就是说,我们进行搜索的时候,每个结点(小猫)都有两个分支(两种选择:要么坐已有的车,要么新买一个车)。n的范围是1~18,所以,此题考察的是dfs。
2023-03-05 14:47:33
62
原创 八数码问题
八数码问题:在3×3的棋盘,摆有八个棋子,每个棋子上标有1至8的某一数字,不同棋子上标的数字不相同。棋盘上还有一个空格(x),与空格相邻的棋子可以移到空格中,问最少移动多少步,使得棋子正确排列在棋盘上。题目要求最少移动步数,由此联想到广搜BFS,即,按照广度优先搜索的原则,移动 x,并记录每次移动的步数,当 x符合条件时,就得到了最少移动步数
2022-11-17 19:44:51
265
原创 搜索之全排列和组合数
全排列和组合数:给定数 n 和 m,表示从 1 到 n 中随机抽取 m 个元素(区分顺序)要求你打印输出所有的情况及总的个数
2022-11-11 00:29:47
248
原创 算法笔记之基础算法模板(修改版)
基础算法模板:排序(快排、归并排序);二分(整数二分、浮点数二分);高精度(加法、减法、乘法);前缀和、差分、双指针、位运算、离散化
2022-10-27 12:55:22
319
原创 算法笔记之基础算法(模板)
排序(快速排序、归并排序)、二分(核心是边界问题)、高精度(高精度加法、减法、乘法)、前缀和、差分、双指针、位运算、离散化……
2022-10-27 00:40:40
1281
原创 第二周——分治
分治及例题,归并排序,我们要用二分来进行分开,然后把分开的小块进行排序,然后递归进行合并成大块,再对大块排序,最终合并成为一个大块,就可以实现归并排序了!这种思想,正是本篇博客要介绍的——分治!!!逆序对:对于给定的一段正整数序列,逆序对就是序列中a_i > a_j 且 i < j 的有序对。知道这概念后,算出给定的一段正整数序列中逆序对的数目。注意序列中可能有重复数字。平面上最接近的点对:给定平面上 n 个点,找出其中的一对点的距离,使得在这 n 个点的所有点对中,该距离为所有点对中最小的。
2022-08-01 20:36:34
141
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人