03 2024 档案
摘要:原题链接:https://www.luogu.com.cn/problem/P2853 题意解读:找到所有奶牛都可以到达的牧场,就是要从奶牛所在位置开始遍历,求所有奶牛能重合的点的个数。 解题思路: 直接从从牛奶所在位置进行DFS,记录每个位置有奶牛能到的个数,个数等于奶牛总数的即合适的牧场。 10
阅读全文
摘要:原题链接:https://www.luogu.com.cn/problem/P1127 题意解读:按字典序排列单词,使得相邻单词的首位字母一样。 解题思路: 由于单词之间可以相邻的条件是前一个单词的末尾字母和后一个单词的开头字母一样,因此可以遍历每一个单词,再找到每一个可以接在其后面的单词, 建立一
阅读全文
摘要:原题链接:https://www.luogu.com.cn/problem/P1807 题意解读:由于对于每一条边u->v,都有u < v,因此节点1的入度一定是0,且是有向无环图,直观上可以通过拓扑排序法搜索每一个节点,计算1到每一个节点的最长距离。但问题在于,入度为0的节点可能不止一个,这样在计
阅读全文
摘要:原题链接:https://www.luogu.com.cn/problem/P4017 题意解读:食物链的顶端不会被其他生物吃,在图结构中设定为入度是0,食物链的底端不会吃其他生物,在图结构中设定为出度是0,此题就是要计算所有入度是0的点到所有出度是0的点一共有多条路径。 解题思路: 首先,来模拟样
阅读全文
摘要:原题链接:https://www.luogu.com.cn/problem/P1113 题意解读:要计算所有任务完成的最早时间,其实取决于最晚完成的那一个任务,计算每一个任务的完成时间,找最大值即可。 解题思路: 下面介绍两种做法:递推法、拓扑排序法 1、递推法 由于杂务k (k>1) 的准备工作只
阅读全文
摘要:原题链接:https://www.luogu.com.cn/problem/P3916 题意解读:寻找每个点所能到达的最大的点。 解题思路: 直观上,可以依次从每个点开始DFS搜索,记录经过的最大点,复杂度是O(n^2)级别,会超时。 可以换一种角度,既然要找每个点可以达到的最大值,那么可以反向建图
阅读全文
摘要:原题链接:https://www.luogu.com.cn/problem/P5318 题意解读:图的建立、DFS、BFS模版题。 解题思路: 本题主要考察建图、图的DFS、BFS遍历。 建图方式:领接表vector<int> g[N]; 需要注意的是,在DFS、BFS搜索领接点时,需要先将领接点编
阅读全文
摘要:原题链接:https://www.luogu.com.cn/problem/P2814 题意解读:已知多组父子关系,找某个人最早的祖先,并查集的应用。 解题思路: 由于存在真正的父子关系,所以在并查集合并的时候,要把p[x] = y中x设置为子,y设置为父,其余都是并查集的常规操作。 由于是计算姓名
阅读全文
摘要:原题链接:https://www.luogu.com.cn/problem/P3879 题意解读:此题本质上是计算倒排索引,所谓倒排索引,即不是通过文章来找单词,而是通过单词来找文章。 解题思路: 要建立单词和文章之间的关系,一个单词对应多篇文章,且要按照文章编号排序,编号还要去重,可以使用如下数据
阅读全文
摘要:原题链接:https://www.luogu.com.cn/problem/P4305 题意解读:对数据进行去重,借助于set、map都可以解决 解题思路: 由于数据范围比较大,不能直接用数组hash,可以借助于set、map,这里采用map 唯一要注意的问题:本题输入输出数据量很大,需要用scan
阅读全文
摘要:原题链接:https://www.luogu.com.cn/problem/P1955 题意解读:要判断约束条件是否可以同时满足,主要是要判断不相等的情况。 解题思路: 对于相等的条件,直接进行集合合并即可; 对于不相等的条件,判断两者是否属于同一个集合,如果形成矛盾,则条件不能成立。 由于i,j的
阅读全文
摘要:原题链接:https://www.luogu.com.cn/problem/P1892 题意解读:此题与关押罪犯问题非常像,本质上就是要合并所有的朋友。 解题思路: 首先,初始化并查集; 对于每一对人的关系,如果是朋友,直接进行合并; 如果是敌人,先查看双方之前是否有记录其他敌人,如果有,则将一方与
阅读全文
摘要:原题链接:https://www.luogu.com.cn/problem/P1621 题意解读:a~b之间的数,把有大于等于p的公共质因数的数进行合并作为一个集合,求一共有多少个集合。 解题思路: 要进行集合合并、统计集合数,可以使用并查集,有两种做法: 1、暴力法 80%的数据在1000范围内,
阅读全文
摘要:原题链接:https://www.luogu.com.cn/problem/P1525 题意解读:有很多罪犯,要关到两座监狱,有一些罪犯之间有仇,并且可以量化出仇恨值,如果关在一起就会冲突,造成的影响就是仇恨值,要使得造成的影响最小,如果可以完全不起冲突,输出0。 解题思路: 首先,要让冲突影响最小
阅读全文
摘要:原题链接:https://www.luogu.com.cn/problem/P1918 题意解读:又一个map的应用 解题思路:只需要用一个map<int, int>记录瓶子数和对应的位置即可。 100分代码: #include <bits/stdc++.h> using namespace std
阅读全文
摘要:原题链接:https://www.luogu.com.cn/problem/P1102 题意解读:前文https://www.cnblogs.com/jcwy/p/18043197介绍了二分和双指针的做法,本文介绍hash的做法。 解题思路: 定义map<int, int> h,保存每个数+c出现的
阅读全文
摘要:原题链接:https://www.luogu.com.cn/problem/P5266 题意解读:本题考察map的应用。 解题思路:直接使用map即可解题。 100分代码: #include <bits/stdc++.h> using namespace std; map<string, int>
阅读全文
摘要:原题链接:https://www.luogu.com.cn/problem/P5250 题意解读:根据题目要求,需要一种数据结构,支持去重、排序、logN的查找,set是最合适的。 解题思路: 先回顾一下set的关键操作: 设set<int> s; 1、添加:s.insert(x) 2、查询个数:s
阅读全文
摘要:原题链接:https://www.luogu.com.cn/problem/P3405 题意解读:要找到特殊城市的对数,即城市名称前两个字母和另一个城市的州一样,城市的州和另一个城市的前两个字母一样,且州不相同。 解题思路: 定义map<string, int> h; 对于每一个城市,将"州+城市前
阅读全文
摘要:原题链接:https://www.luogu.com.cn/problem/P3370 题意解读:本题要求理解哈希的原理,自行建立哈希表解题,如果直接使用map,就不推荐。 解题思路: 先介绍哈希的原理 1、什么是哈希?什么是哈希表? 先从一个问题出发:给定不超过105个整数(取值1~109),要统
阅读全文
摘要:原题链接:https://www.luogu.com.cn/problem/P1536 题意解读:城镇之间现有的道路关系可以将城镇划分的若干集合,每个集合内的城镇是互通的,要计算最少增加多少条道路,使得每个集合都相通。 解题思路: 利用并查集,统计一共出现多少个集合,即p[i] = i的数量, 最少
阅读全文
摘要:原题链接:https://www.luogu.com.cn/problem/P1551 题意解读:要判断两人是否是亲戚,只需要看两人是否属于一个集合,基于所有已知的亲戚关系,可以建立多个有亲戚关系的集合,这个过程可以借助并查集。 解题思路: 并查集: 1、定义 并查集是一种树形数据结构,本质上是多棵
阅读全文
摘要:原题链接:https://www.luogu.com.cn/problem/P1185 题意解读:在表格中绘制二叉树,有几个关键点 1、结点用小写字母 o 表示,对于一个父亲结点,用 / 连接左子树,用 \ 连接右子树,表格其余地方填空格。 2、第m 层结点若两个属于同一个父亲,那么它们之间由 3
阅读全文
摘要:原题链接:https://www.luogu.com.cn/problem/P3884 题意解读:要计算二叉树的深度、宽度、节点间的距离,深度、宽度的概念很好理解,节点间的距离描述是:节点u,v 之间的距离表示从u 到v的最短有向路径上向根节点的边数的两倍加上向叶节点的边数。说人话就是:u到v的距离
阅读全文
摘要:原题链接:https://www.luogu.com.cn/problem/P1030 题意解读:已知中序、后序,求先序。 解题思路: 与洛谷题单指南-二叉树-P1827 [USACO3.4] 美国血统 American Heritage非常类似,不在介绍过程,直接给出代码。 100分代码: #in
阅读全文
摘要:原题链接:https://www.luogu.com.cn/problem/P1305 题意解读:二叉树的建立和前序遍历,主要注意每个节点值是小写字母。 解题思路: 树的存储: struct node { char value; int l, r; } tree[30]; 对于节点a,存到第1个,即
阅读全文
摘要:原题链接:https://www.luogu.com.cn/problem/P1229 题意解读:已知前序、后续遍历序列,计算中序可能的数量,没有直接算法,更像一道智力题。 解题思路: 观察题目中给定的4个图形: 会发现一个现象: 对于三个节点的二叉树,要使前、后序遍历序列确定的情况,中序遍历序列不
阅读全文
摘要:原题链接:https://www.luogu.com.cn/problem/P1364 题意解读:医院的位置使所有居民所走的路程之和为最小,即找到一个节点,该节点到其他所有节点的距离*其他节点的权值即人数之和最小。 解题思路: 看起来是一个二叉树问题,本质上是一个图论问题,有三种方式可以求解: 1、
阅读全文
摘要:原题链接:https://www.luogu.com.cn/problem/P5076 题意解读:此题本质上是要实现一个二叉搜索树的功能。 解题思路: 从数据规模10^4来看,只要复杂度在n^2范围内基本上是可以通过的,下面给出两种做法: 1、有序数组法 对应5个操作的实现逻辑如下: 操作一:查x的
阅读全文
摘要:原题链接:https://www.luogu.com.cn/problem/P1827 题意解读:已知二叉树的中序、前序遍历结果,求后序遍历结果。 解题思路: 已知中序、前序(或后序)遍历的结果,要求后序(或前序)遍历的结果,本质上就是借助于已知的前序(或后序)遍历结果寻找二叉树的根, 再根据根节点
阅读全文
摘要:原题链接:https://www.luogu.com.cn/problem/P4913 题意解读:计算二叉树的深度 解题思路: 首先介绍二叉树的存储方式,对于本题,直接用数组模拟,数组的下标即节点号 struct node { int l, r; } tree[N]; tree[i].l存的是节点i
阅读全文
摘要:原题链接:https://www.luogu.com.cn/problem/P4715 题意解读:计算亚军得主,注意能力值最高的肯定是冠军,但能力值第二高的不一定是亚军,因为有可能中途就遭遇冠军。 解题思路: 根据题意,两两比赛,一轮后再按顺序两两比赛,形如一棵二叉树,但解题其实用不到二叉树的数据结
阅读全文
摘要:原题链接:https://www.luogu.com.cn/problem/P2234 题意解读:要计算每一天最小波动值的和,需要对每一天求最小波动值,再求和,如果暴力法,时间复杂度在1+2+3+......+32767≈5*10^8,可能会超时。 解题思路: 1、暴力法:由于本题测试数据比较水,实
阅读全文
摘要:原题链接:https://www.luogu.com.cn/problem/P4387 题意解读:判断一组序列入栈后,出栈序列的合法性。 解题思路: 数据长度100000,直接模拟堆栈的入栈和出栈即可 遍历每一个入栈元素,依次入栈, 每一个元素入栈后,比较栈顶元素和出栈序列第一个, 如果相等,则出栈
阅读全文
摘要:原题链接:https://www.luogu.com.cn/problem/P1241 题意解读:括号配对问题,直观上是堆栈的应用。关键的匹配策略是读懂该句:考察它与它左侧离它最近的未匹配的的左括号。 解题思路: 本题所需核心数据结构是堆栈,由于要实现从栈顶找到第一个未匹配的左括号,所以堆栈中只存所
阅读全文
摘要:原题链接:https://www.luogu.com.cn/problem/P2058 题意解读:计算24小时时间窗口内不同国家的数量,是队列的典型应用。 解题思路: 本题需要用到两个关键的数据结构:队列、数组 队列用来保存24小时内到达的船的时间,数组用来保存24小时内每个国家有多少人 每到一只船
阅读全文
摘要:原题链接:https://www.luogu.com.cn/problem/P1540 题意解读:本题模拟内存的调入调出,内存先入先出的特性就是队列。 解题思路: 本题需要两种数据结构:队列、数组 队列用来模拟内存的操作,数组充当hash表用于判断单词在内存是否存在 核心逻辑:对于每一个单词,如果内
阅读全文
摘要:原题链接:https://www.luogu.com.cn/problem/P1160 题意解读:本题是双向链表的模拟题,要快速实现M个节点的删除,用数组模拟链表是最佳做法。 解题思路: 双向链表关键要实现好两个操作: void add(int k, int v); //在第k个节点后增加第v的号节
阅读全文
摘要:原题链接:https://www.luogu.com.cn/problem/P1996 题意解读:约瑟夫问题是队列的典型应用。 解题思路: n个人围圈报数,可以直接基于数组实现循环队列操作,再定义额外数组记录每个人是否已经出圈即可。 更直观的做法,定义队列,初始放入1~n, 然后重复n次,每次从1~
阅读全文
摘要:原题链接:https://www.luogu.com.cn/problem/P1449 题意解读:计算后缀表达式,堆栈的典型应用。 解题思路: 本题要解决两个问题:字符串的读取、后缀表达式的计算,整个过程如下, 要将字符串拆接触操作数、操作符,将操作数放入堆栈,操作符用于计算 遍历每一个字符: 1、
阅读全文
摘要:原题链接:https://www.luogu.com.cn/problem/P3613 题意解读:此题很容易想成用二维数组求解,但是最多有10^5 * 10^5个寄包柜格子,二维数据会爆空间,题目明确各自一共不超过10^7,所以需要动态数据结构vector。 解题思路: vector的问题在于需要提
阅读全文
摘要:原题链接:https://www.luogu.com.cn/problem/P3156 解题思路:简单的数组题,唯一需要注意的是读写的数据量比较大,输入输出最好用scanf、printf 100分代码: #include <bits/stdc++.h> using namespace std; co
阅读全文
摘要:原题链接:https://www.luogu.com.cn/problem/P1825 题意解读:计算最短路,依然是BFS。 解题思路: 相比传统的最短路迷宫,多了个传输装置,要解决几个关键问题: 1、传输装置的存储 定义一个数组,vector<node> trans[30],数据的每个元素都是一个
阅读全文
摘要:原题链接:https://www.luogu.com.cn/problem/P1032 题意解读:要计算子串变换的最少步数,典型的最短路问题,可以通过BFS求解。 解题思路: 思路上比较直观,从给定的字符串开始,找有多少种替换可能,依次进行替换,存入队列,继续BFS,过程中记录替换的次数 但是,有一
阅读全文
摘要:原题链接:https://www.luogu.com.cn/problem/P1162 题意解读:要把闭合圈内的0填为2,DFS处理即可。 解题思路: 由于方阵内只有一个闭合圈,所以闭合圈以外的0一定和边缘相连通,只需要从边缘开始,把0的连通块全部标记为2 最后再输出时,2输出0,1输出1,0输出2
阅读全文
摘要:原题链接:https://www.luogu.com.cn/problem/P1596 题意解读:本题就是计算连通分量的数量,通过DFS洪水填充即可。 解题思路: 遍历每一个格子,如果没有标记过且有水,则对其进行标记,再枚举8个方向的格子,判断是否同样没有水且没有标记过,DFS递归处理。 100分代
阅读全文
摘要:原题链接:https://www.luogu.com.cn/problem/P2404 题意解读:将整数拆成若干数相加,按字母序输出,可以转换成从小到大往数组填数的问题,直到填的数之和等于n。 解题思路: 通过DFS,每次填一个数,填数时从1~n-1逐个填 注意两个条件不能继续DFS: 1、将填的数
阅读全文
摘要:原题链接:https://www.luogu.com.cn/problem/P1101 题意解读:对于方阵中的每一个字符,在8个方向上判断是否和"yizhong"匹配,是一个递归问题。 解题思路: 用char a[N][N]存储所有字符方阵,用bool b[N][N]标记每个字符是否在任一方向上和y
阅读全文
摘要:原题链接:https://www.luogu.com.cn/problem/P1019 题意解读:要计算接龙能得到的最长字符串,可以通过DFS暴搜所有可能的接龙方案 解题思路: DFS的关键在于两个判断: 1、下一个单词是否可以和上一个单词接龙,最短公共长度是多少(只需要看两个单词的最短公共长度,这
阅读全文
摘要:原题链接:https://www.luogu.com.cn/problem/P1605 题意解读:从起点走到终点的方案数,DFS可遍历所有情况。 解题思路: 在DFS过程中,有两种标记 墙:不能访问 已访问过的,不能重复访问 定义数组int a[N][N]表示迷宫,1是墙或者已访问过的,0是可以通过
阅读全文
摘要:原题链接:https://www.luogu.com.cn/problem/P1433 题意解读:计算经过所有奶酪一次的总路径最短,可以采用dfs、dp等方法。 解题思路: 最直接的思路是DFS,暴搜所有的路径方案,计算最小距离,n最大是15,复杂度为15!≈10^12,必定会超时,先保证正确性,得
阅读全文
摘要:解题思路参考:https://www.cnblogs.com/jcwy/p/18003130 这里给出DFS方法的代码。 100分代码: #include <bits/stdc++.h> using namespace std; int s[15], k[15], v[15], n; int ans
阅读全文
摘要:参考:https://www.cnblogs.com/jcwy/p/17999205 的方法二
阅读全文
摘要:原题链接:https://www.luogu.com.cn/problem/P2895 题意解读:所谓安全格子,就是在所有流星坠落之后,没有被烧焦的格子,要计算从起点到这些格子任一一个的最短路径,BFS可以解决。 解题思路: 1、读取数据,先把所有流星坠落点以及周围被烧焦的格子进行标记,得到安全格子
阅读全文
摘要:原题链接:https://www.luogu.com.cn/problem/P1135 题意解读:计算A到B至少要按几次电梯,本质上就是求A到B的最短路径,可以通过BFS解决。 解题思路: 位于每一层,有两种选择:向上、向下 BFS搜索直接从A找到B,每扩展一层,层数+1,层数即按电梯次数 100分
阅读全文
摘要:原题链接:https://www.luogu.com.cn/problem/P1443 题意解读: 无论是国际象棋还是中国象棋,马的活动范围都是一样的: 只不过国际象棋棋子是在格子中,中国象棋棋子是在交点,坐标的变化方式是一样的,根据此活动范围,计算马到达每一个点的最短路径。 解题思路: 根据马的活
阅读全文
摘要:原题链接:https://www.luogu.com.cn/problem/P2392 解题思路:参考https://www.cnblogs.com/jcwy/p/18003097 前面已经给出了二进制法的代码,这里给出DFS的代码 简化一下逻辑:只需要枚举子集和,然后计算剩下元素和,取较大那一组的
阅读全文
摘要:原题链接:https://www.luogu.com.cn/problem/P1219 题意解读:八皇后,经典回溯问题。 解题思路: 逐行摆放棋子,关键在于如何快速判断行、列、正斜(左上到右下)、反斜(右上到左下)方向有没有已放其他棋子 1、由于逐行摆放,因此行不需要判断 通过一个bool col[
阅读全文
摘要:原题链接:https://www.luogu.com.cn/problem/P3743 题意解读:设备使用的时间越久,需要充电的总时间也越多,具备单调性,根据使用的时间,计算需要充电的时间,如果充电总时间<=使用的时间,说明有电量还能富余,使用时间还可以更多,因此只需对使用时间进行二分即可。 解题思
阅读全文
摘要:原题链接:https://www.luogu.com.cn/problem/P1163 题意解读:利率越小,贷款期限和每个月还的钱固定的情况下,越有可能能够还完全部的贷款,具备单调性,因此给定贷款利率、贷款月数、每月还款钱数,可以计算最终贷款还剩下多少,有两种情况:>=0,说明利率可能大了,要试探更
阅读全文
摘要:原题链接:https://www.luogu.com.cn/problem/P1182 题意解读:每段和的最大值越小,则分段数就越多,因此可以通过给定每段和的最大值,将分段数划分为两类:<=M,>M,对每段和的最大值进行二分即可。 解题思路: 二分的判定条件为,给定每段和的最大值,计算分段数,计算逻
阅读全文
摘要:原题链接:https://www.luogu.com.cn/problem/P3853 题意解读:相邻路标的最大距离即空旷指数,空旷指数越小,用的路标越多,因此可以根据空旷指数将使用路标情况分成两类:路标数<=K,路标数>K,对空旷指数进行二分即可。 解题思路: 二分的判定条件为, 给定空旷指数,计
阅读全文
摘要:原题链接:https://www.luogu.com.cn/problem/P2678 题意解读:最短跳跃距离越大,要移走的石头就越多,因此可以根据最短跳跃距离的不同把情况分为两类:移走的石头数<=M、移走的石头数>M,对最短跳跃距离二分即可。 解题思路: 二分的判定条件如下: 对于给定最短跳跃距离
阅读全文
摘要:原题链接:https://www.luogu.com.cn/problem/P2440 题意解读:切出来的长度越短,则段数越多,因此切出来的长度可以把情况分成两类:段数大于等于k、段数小于k,可以通过二分长度来解决。 解题思路: 二分的关键在于判定条件,此题就是对二分到的长度计算可以切割的段数,如果
阅读全文