![](https://img-blog.csdnimg.cn/20201014180756724.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
搜索
陈末iiiiiiiiiiii
Retired
展开
-
AtCoder Beginner Contest 231 E 贪心 DFS 记忆化搜索
题目有N种货币,每种对应ai元,a1一定等于1,且ai-1一定是ai的倍数。求出完成一笔X元的交易所需的最小货币数。即支付钱加找钱所需的货币数加起来最小。题解思路贪心策略用这个付完,即不找零。要么用这个多付钱(前提是本来有多,否则就是白费的搜索)然后求最小的找零数。在这两种情况中取min因为a是从1开始的,所以必然能取到数。这题复杂度一言难尽,居然能这么暴力。AC代码#include <bits/stdc++.h>//#include <unordered_map原创 2021-12-12 16:34:06 · 353 阅读 · 0 评论 -
牛客xb月赛41 E 双条件限制的BFS迷宫问题 标记处理小细节
题目题解思路到达这点的时候,能更新这个点的条件不一定是之前就到达或者没到达。被卡了好久。血多的时候同样需要更新这个点,否则就不满足最优了。所以这个标记应该填上之前到达这个点的血量值,在血量高的情况下,这个点才更有潜力到达终点。找了挺久的终于de出来了。AC代码#include <bits/stdc++.h>//#include <unordered_map>//priority_queue#define PII pair<int,int>#def原创 2021-12-07 09:55:18 · 179 阅读 · 0 评论 -
2021牛客寒假算法基础集训营4 H 边化成运算符 计算每个节点到根节点的表达式值 DFS 待定形参
题目题解思路一开始想着先dfs一遍处理乘法除法的值。第二次dfs的时候标记特判。Wa了。其实不用这么麻烦,我们只需从头扫到根节点,将有潜力变成乘法或者除法里的数分开进行。当运算到加减法的时候可以将之前的有潜力的就一定不可能再变成乘除法了,将加减的数变成新的有潜力的数。乘除法类似。除法记得逆元这样属实巧妙。还是说我写太少树的题了。还是太菜了。AC代码#include <bits/stdc++.h>//#include <unordered_map>//p原创 2021-11-25 16:46:05 · 688 阅读 · 0 评论 -
力扣375. 猜数字大小 II 记忆化搜索 区间DP 最小化最大值
题目样例1 160<= n <= 200题解思路一般这样最小化最大值都是二分来解决的,这题貌似用不了二分。数据量小直接爆搜(记忆化)枚举两个区间中选择的每一个点,取两种分支的最大值,加上费用后取最小值更新答案。即在每个最大分支中取最小值状态表示 dp[ i ] [ j ] i 到 j 的序列中 选择的花费的最小的最大值。状态转移和记忆化搜索一样。按照区间dp的套路初始化好搞好边界就能AAC代码记忆化搜索const int INF = 0x3f3f3f3f;原创 2021-11-12 17:35:26 · 53 阅读 · 0 评论 -
2021广东省大学生程序设计竞赛 J DP完全背包 预处理 BFS
题目初始位置是0,目标位置是 K每次只能向前或者向后走 平方数的步数 例如 1 4 9 16 25 …求到达目标的最小步数 。题解思路先预处理出平方数大概320个数左右,每个平方可以使用的次数的无限的,(使用次数)容量也是无限的。直接对每种背包(平方数)进行完全背包处理。因为可以往前走也可以往后走,所以先将正向1e5的数正向走这个背包+权值。再反向走-这个权值。这样就能预处理出所有答案了。这种查询和输出相同复杂度的就只能往预处理方向思考!使用bfs进行限制步数的预处理也是可以的。AC代原创 2021-10-17 19:50:33 · 80 阅读 · 0 评论 -
2021广东省大学生程序设计竞赛 A 优先队列 大顶堆 二分 思维
题目给你三个数n,m,k然后会根据n,m生成数列1×1,1×2,······,1×m2×1,2×2,······,2×m···n×1,n×2,······,n×m问你将这些数字中第k大的数字是多少?题解思路AC代码优先队列#include <iostream>#include <cstdio>#include <cstring>#include <queue>#include <vector>#include <原创 2021-10-17 19:21:40 · 98 阅读 · 0 评论 -
166. 数独 DFS 之 剪枝 二进制 位运算 优化 思维
题目题解思路4大剪枝常用剪枝策略首先进行优化搜索顺序,每次搜索可以放的数最少的的点 。再根据行列九宫格不能相同,想到位运算优化(我是想不到)。利用按位与 & 的 清零性质 (即一位为0 按位与出来的一定是 0 )用 0 表示放了这个位置的数 , 1表示没放 。这样的话 每行列和九宫格的 所有状态 就可以用一个 2 ^ 9 - 1 的 数 表示了其次这里可以lowbit来快速找出1的位置来让我们放数 。实现初始化将 所有行列 子棋盘的状态变为1 即表示都没放原创 2021-10-15 19:54:35 · 261 阅读 · 0 评论 -
178. 第K短路 A*算法 反向dij 获取估计距离
题目题解思路和上一题差不多,这里是反向建边出来的最短路作为估计距离。估计距离(sate到T的最短路距离) + 实际距离 (从S出发走过的距离) <=实际距离(sate到T的实际距离) + 实际距离 (从S出发走过的距离)因为控制的是sate的最短路,所以就能让答案逼近在最短路附近 。再通过控制终点从答案出的次数,第一次是最小值,第二次就是第二小值…以此类推。(证明见闫总视频,与证明第一次弹出是最小值类似)并且这里还得别的控制边数入队也不能超过k , 不然会T , 答案路径中 ,一条原创 2021-10-13 09:27:22 · 79 阅读 · 0 评论 -
179. 八数码 A* Astar 算法 双重优化 BFS 优先队列 实际距离 + 预计距离
题目题解思路看前须知在搜索中常用的 一维表示二维 行数为 k / i 列数为 k % iA*一般用在一定到达的情况。(否则复杂度比普通bfs还高,因为使用优先队列)所以 我们先特判掉 无法到达的情况 。 改变X的位置 逆序数对要么不变要么加2减2 。 所以当题目的逆序对数为奇数时之间特判了。A*(边权非负)在普通bfs的基础上引入了一个启发函数,用每个状态的曼哈顿总数来表示预计距离 , 普通的加入层数则是实际距离 。 再将启发函数值 ( 预计距离 + 实际距离 )作为优原创 2021-10-12 19:48:35 · 357 阅读 · 0 评论 -
190. 字串变换 双向BFS substr函数
题目题解思路之前一直以为substr(i,j)是截取 下标i 到 j 的子字符串 。结果是 从 i 开始 长度为 j 的子字符串。对从初始值和答案两边同时搜索答案,在规定步数内 碰头的时候就是答案了。双向搜索可以节省 1e3的数量级。对字符串的操作就是可以走的每一步 。我们用unordered_map 存储走到这一步要的时间。这里使用引用为了对函数的复用,即两边同时走的时候有些操作是相同的。这里的每一步是指队列中和队头的时间相同的数同时扩展出的字符串。当这个字符串在反向的unorde原创 2021-10-12 15:24:03 · 69 阅读 · 0 评论 -
175. 电路维修 双端队列广搜 类似堆优化dij的 双端队列(强行优先)BFS
题目链接题解思路因为走的方向都是呈偶数形式的(对和的损耗),所以无法走到奇数的点。可以进行特判。记录这个点往四个方向的情况, 走的时候的标志以及地图的对应标志。当符合地图标识的时候,就无需消耗权值,之间把他入队头。否则入队尾。这样就强行形成了一个小顶堆。有堆优化dij的味道了。每次从队头取出元素来进行松弛操作。每个元素只能用来松弛其他边一次。最后到n m 的最小费用就被搜索出来了。AC代码#include <iostream>#include <cstdio原创 2021-10-10 21:26:26 · 82 阅读 · 0 评论 -
173. 矩阵距离 多源BFS的优化
题目题解思路先将所有要BFS源点入队 ,这样比一个一个的入队省了很多时间。因为全部入队每次从最优的点跑出最优解。而一次一次就是一个源点一遍一遍的跑全图。AC代码#include <iostream>#include <cstdio>#include <cstring>#include <queue>#include <vector>#include <algorithm>#include <map>原创 2021-10-08 21:14:22 · 109 阅读 · 0 评论 -
1076. 迷宫问题 BFS 最短路 记录路径的便捷方式
题目题解思路之前的喜欢在入队的时候加入路径,这样导致内存和时间都挺浪费的。其实可以开一个数组 ,反着跑bfs,用数组记录前一个的节点。在输出的时候就直接正着输出就行了。(有点链表的感觉)用之前的办法T了。AC代码#include <iostream>#include <cstdio>#include <cstring>#include <queue>#include <vector>#include <algorit原创 2021-10-08 18:19:47 · 198 阅读 · 0 评论 -
200. Hankson的趣味题 DFS枚举约数 试除法枚举所有质因子和它的次数
题目题解思路x肯定是b1的约数,所以从这里入手(我是想不到)。直接枚举所有约数如果符号上面的条件就可以作为答案。根号D2e3这样的话复杂度大概5e42e3 大概1亿左右,这样是很有可能超时的。时间复杂度已经接近了,只要稍微优化一下就行了。大概在5e3*2e3 1e7筛出质数后。我们直接枚举所有质数,以及它的次数。我们只在D的质因子下枚举。这样直接用dfs暴力枚举出它的约数,约数个数(这一步可以减少大量dfs的次数)不会超过1600的。dfs的次数最多1600,所以可以忽略复杂度。原创 2021-10-04 20:59:02 · 160 阅读 · 0 评论 -
198. 反素数 DFS 暴力搜索 约数定理
题目题解思路在 1 到 N 中 如果 K 被称为反素数 ,那么他约数数量一定是 在 1 到 N 中 最多的 , 而且 他还要尽可能的小,不然就不一定都是小于号了 ,这样才能符号反素数的要求 。很容易想到贪心策略前面的质因子的次数肯定要比后面的多 ,这样数才能尽可能的小 。并且最大的质因子次数必然不超过31,2的30次方就大概10亿多了。而且质因子延展还不会超过第9个素数。这些前置知识感觉都是要记的,写多题目就记住了。这样我们就可以爆搜了 时间复杂度粗略估计这样怎么点从2开始往原创 2021-10-04 18:56:31 · 95 阅读 · 0 评论 -
Codeforces Round #746 (Div. 2) C 按位异或 DFS 分块
题目Bakry 遇到了一个问题,但由于他懒于解决,所以他请求您的帮助。给定一个由 n 个节点组成的树,第 i 个节点为从 1 到 n 的每个 i 分配了值 ai。提醒一下,n 个节点上的树是具有 n-1 条边的连通图。您想从树中删除至少 1 个,但最多 k-1 个边,以便以下条件成立:对于每个连接的组件,计算其中节点值的按位异或。然后,对于所有连接的组件,这些值必须相同。有没有可能达到这个条件?输入每个测试包含多个测试用例。第一行包含测试用例数 t (1≤t≤5⋅104)。测试用例的描述如下。原创 2021-10-04 10:45:12 · 89 阅读 · 0 评论 -
POJ - 3579 二分枚举答案 查找第K大
题目题解思路很显然不能直接求出ans数组,先将数组排序,因为是任意差值的绝对值,顺序并不影响,我们对答案进行枚举。ans数组大小为n*(n-1)/2 ,这是可以根据等差数列求和得到的。答案需要介于符合大于一半的ans数组数到不符合的左右。设枚举的答案为p当我们排序完后,很容易枚举出p小于等于那些差值的数量和sum,利用二分函数就可以得到,不论奇数偶数都应该大于ans数组的一半,因为sum包含了p自己的值。这里还有个有点玄学的问题。关于二分出来的边界问题,如果验证出来要从下界更新且都为正整数,原创 2021-07-30 16:40:38 · 140 阅读 · 0 评论 -
POJ - 2976 二分枚举答案 最大化平均值
题目题解思路白书里的例题,直接对浓度进行枚举。对每个浓度贪心的判断是否可行。将方程转变,浓度带入后排序贪心。对于二分枚举答案,答案需要精度时,我们一般直接让答案二分跑100次,而且边界尽量开大点。坑点四舍五入AC代码#include <iostream>#include <cstdio>#include <algorithm>using namespace std;long long a[1010],b[1010]; double c[原创 2021-07-30 15:13:34 · 127 阅读 · 0 评论 -
POJ - 1064 二分枚举答案 floor向下取整函数
题目题解思路我们可以得到答案的区间 0 到薯条平均长度 。直接取上界为INF,下界为0进行二分枚举答案。我们让二分进行100次,可以让答案精确到10的负30次方,所以上界不需要那么精确都行。输出有点坑,不能四舍五入。用floor函数先乘100将那两位数提出然后抹去小数位,然后除回去。AC代码#include <iostream>#include <cstdio>#include <algorithm>#include <cmath>us原创 2021-07-29 14:30:03 · 118 阅读 · 0 评论 -
AcWing 3734. 求和 DFS枚举 区间优化处理
题目链接题解思路策略就是枚举到符合1e9的数,这样需要搜到10位,枚举完排序,对应区间进行优化,暴力会TLE,枚举数到目标数可以直接做乘法乘数量来减少枚举的数量。数据类型记得longlong int 直接爆。AC代码#include <iostream>#include <cstdio>#include <algorithm>using namespace std;long long a[1300000];int p;void dfs(原创 2021-07-08 18:29:03 · 73 阅读 · 0 评论 -
POJ - 3187 回溯DFS 或者 全排列next_permutation() 暴力枚举
题目链接题解思路因为数据量小,考虑枚举,可以用DFS枚举全排列,然后判断答案是否正确,因为我们从1开始枚举,本来就是最小字典序,所以有答案就直接return。也可以用next_permutation(),将前N个数放入数组,然后进行全排列循环,在里面循环判断是否符合答案。AC代码#include <iostream>#include <cstdio>#include <algorithm>#include <cstring>using原创 2021-07-02 16:21:21 · 85 阅读 · 0 评论 -
ACwing3481. 阶乘的和 二进制枚举 也可以DFS
题目数N能否由某些数的阶乘的合组成题解思路很自然的先把每个数的阶乘放到数组里,因为1e6不超过10的阶乘,所以只需取到10的阶乘就行。这样我们也可以用DFS解决,对每个数的阶乘选择取还是不去,及时剪枝,也能AC。我们玩点新花样,同样和上一篇博客一样用二进制来枚举这个过程。对阶乘进行0到2的9次方的枚举,对每个0代表不选择1代表选择,将答案全放进set里,如果N在集合里存在就是对的。AC代码#include <iostream>#include <cstdio>#原创 2021-06-10 22:03:06 · 95 阅读 · 0 评论 -
Aizu - 0121 BFS 反向BFS 利用map进行类似hash的状态压缩 string操作小妙招
题目题解思路这题类似八数码,都是转换回一个状态,而且状态受到多影响,不能单纯的BFS操作,于是有了类似打表的方法,反向BFS。用终点推出能到达的每一个位置,并存起来,这下就是整个图的状态对应数值的情况了,八数码用的康托展开hash出了图的每一个情况对应的数值,这题数据量小,我们直接用map进行hash。将图一维化变成字符串。利用从没到过的新状态map值等于0来存入数值。没用过 不太敢用 的小妙招 int pit = s.find('0'); //直接返回第一个0的位置 string原创 2021-06-02 21:24:45 · 94 阅读 · 2 评论 -
POJ - 3009 DFS 回溯 部分点会重复走 不标记
题目题解思路因为石头击中砖块后,砖块会消失,破坏了地形,所以我们需要回溯处理。又因为石头能走的路径受到旁边砖块的影响,所以我们不需要标记(也可以标记在次数内),因为题目有行走的次数限制,而且不多,所以我们只需要剪枝,不需要标记。此题给我的感觉和那题推箱子有点类似,人的位置会影响箱子能推的位置,所以,给箱子能多走一部分重复的路的权限。AC代码#include <iostream>#include <cstring>#include <cstdio>usi原创 2021-06-02 19:41:30 · 90 阅读 · 0 评论 -
POJ - 2386 DFS染色法 模板题
题目题解思路对每个目标位置,枚举8个方向。进行染色处理,遍历全图,未染色的进行DFS操作染色。AC代码#include <iostream>#include <queue>#include <cstdio>using namespace std;int dx[8] = {-1,1,0,0,-1,-1,1,1};int dy[8] = {0,0,-1,1,-1,1,1,-1};int n,m,ans = 0;bool vis[120][120];原创 2021-06-01 19:29:20 · 79 阅读 · 0 评论 -
POJ - 1753 DFS回溯法 类似八皇后问题 总感觉会超时就不敢写
题目题解思路时间复杂度 2 的16次方 。啊这,我太高估它了!对每个位置进行翻转或者不翻转的操作,翻转了记得回溯,当到遍历完所有位置时,检查有没有答案,如果有就更新,更新出来的答案还可以剪枝操作。看来以后要先算算时间复杂度了!!!AC代码#include <iostream>#include <cstdio>#include <cstring>#include <queue>#include <cmath>#includ原创 2021-05-28 17:31:02 · 138 阅读 · 0 评论 -
HDU - 1254 双BFS 坑题 被路径可重复卡了半天 还是想的太少了
题目链接题解思路一开始以为是水题,直接不考虑人对箱子BFS,激情一WA,认真看题后发现是双BFS!当箱子推的时候,人必须能在对应的位置上才能推。这时候就要对人BFS,此外人不能跑到箱子那个位置,所以我们对箱子BFS时要每次记录人和箱子的位置和箱子的步数。判断完发现还是WA了,太久没玩这个游戏了,箱子的位置时影响人能推的位置的,箱子是可以重复走一部分的路的。举例,此时人被困在墙里面只能向右边推箱子,人解放了之后把箱子推回去就可以到终点3了此题写起来虽然没有难度,但是想全方面还是挺难想的啊原创 2021-05-21 11:03:10 · 75 阅读 · 1 评论 -
AcWing每日一题2021.5.19 3483. 2的幂次方 递归 二进制
题目链接题解思路可以看出是递归,找到出口指数为1或者0的时候。因为是这个形式是有序的从大到小,所以我们先找出这个数 能用2的幂次 表示的最大的数 ( 利用位运算求出最大的数)此时求加号的处理需要特判,当数字不是第一次分解是才要加上加号。当取下来的数大于2,继续分解。例如8 用2(3)表示 二进制 1000利用位运算取出 i = 3; 即2的幂次的最大位。 2( dfs (3) )3 继续分解 二进制 112( 2 )此时 res 还是 string 还是空的 不+此时原创 2021-05-19 20:56:53 · 98 阅读 · 0 评论 -
双BFS的迷宫 BFS
题目题解思路先让毒跑走完,能走的路,并且标记该点用的时间,再对人进行BFS(用毒走的时间进行限制)即可 。可以对毒进行剪枝操作,当该毒走到该点的时间小于之前走过的时间时,才能进行进一步操作。这样要对时间初始化最大值。 if ( dutime[tmm.x][tmm.y] > tmm.time) { dutime[tmm.x][tmm.y] = tmm.time;AC代码#include <iostream>#includ原创 2021-05-16 19:23:08 · 49 阅读 · 0 评论 -
蓝桥杯 省赛 填空题 迷宫 带路径的BFS 对结构体的妙用 路径存储
题目下图给出了一个迷宫的平面图,其中标记为1 的为障碍,标记为0 的为可以通行的地方。010000000100001001110000迷宫的入口为左上角,出口为右下角,在迷宫中,只能从一个位置走到这个它的上、下、左、右四个方向之一。对于上面的迷宫,从入口开始,可以按DRRURRDDDR 的顺序通过迷宫,一共10 步。其中D、U、L、R 分别表示向下、向上、向左、向右走。对于下面这个更复杂的迷宫(30 行50 列),请找出一种通过迷宫的方式,其使用的步数最少,在步数最少的前提下,请找出转载 2021-04-15 23:08:04 · 79 阅读 · 0 评论 -
牛客网24554 迷宫 DFS BFS板子题 到底什么时候回溯这是个问题 我总是喜欢回溯
题目给出一个n*m的迷宫,其中标记为1的为障碍,标记为0的为可以通行的地方。迷宫的入口为左上角,出口为右下角,只能从一个位置走到这个它的上、下、左、右四个方向之一。如果能顺利走出迷宫就输出YES,否则输出NO地址题解心得 DFS 一条路走到黑这是道 板子题 我开始却TLE了?问题有点大,这题没有问最优的情况,我们只用标记走过的路就行了,不用进行回溯。如果题目有路,那么在DFS出的路总有路能到达,我们只需标记走过的路不让打转即可。被一种思维误导了,我总是喜欢回溯来解决DFS问题,我总是怕终点路的行原创 2021-04-12 17:57:00 · 256 阅读 · 2 评论 -
NOJ1404 蓝桥杯2n皇后问题 对角线检查的漏网之鱼 DFS 回溯
题目题目地址给定一个n*n的棋盘,棋盘中有一些位置不能放皇后。现在要向棋盘中放入n个黑皇后和n个白皇后,使任意的两个黑皇后都不在同一行、同一列或同一条对角线上任意的两个白皇后都不在同一行、同一列或同一条对角线上。问总共有多少种放法?n小于等于8。题解思路首先只要在n皇后的基础上在放完黑皇后再放白皇后即可,在DFS上多加个形参,让它进入对第二个皇后的搜索但是对第二个皇后可以放的位置的检查函数却难倒我了。起初我想的是这样的,看似正确但是输出的答案却变多了我原本以为在找完第一个皇后后图里的所原创 2021-04-08 12:18:13 · 191 阅读 · 1 评论 -
洛谷P2404 自然数的拆分 DFS 回溯 去重 字典序
题目任何一个大于1的自然数n,总可以拆分成若干个小于n的自然数之和。现在给你一个自然数n,要求你求出n的拆分成一些数字的和。每个拆分后的序列中的数字从小到大排序。然后你需要输出这些序列,其中字典序小的序列需要优先输出。题目地址题解思路首先考虑用一个数组记录这一回合的值,并且再用一个step变量记录这个回合数的个数,再开一个sum变量给DFS判断搜索的结束。按照这个思路我写出了部分数字重复相加但有些回合的数字类似进行了排列组合,比如这样:结果发现再开一个当前采用值的变量放到for循环里面就可以去重,原创 2021-04-07 17:08:43 · 156 阅读 · 0 评论 -
CodeForces115A 该公司将举办一场聚会 DFS 并查集变式 寻找深度最高的树
题目一家公司拥有 n 名雇员,编号从 1 到 n 。每名雇员要么没有直接上司,要么只有一位直接上司 (直接上司是另一名具有不同编号的雇员)。如果满足以下条件之一,那么一名雇员 A 就被称之为另一名雇员 B 的 主管:雇员 A 是雇员 B 的直接上司;雇员 B 的直接上司是雇员 C,而雇员 A 是雇员 C 的主管。该公司在管理上不会形成层级循环。换言之,不会存在一名雇员是他/她自己的直接上司的主管。今天,该公司将举办一场聚会。这涉及到将全部的 n 名雇员划分到多个小组中:每名雇员必须恰好属于一个小组原创 2021-04-01 16:52:07 · 158 阅读 · 0 评论 -
洛谷 P1219 八皇后问题 回溯法 DFS深度优先搜索 搜索 对角线优化
题目地址 [USACO1.5]八皇后 Checker Challenge 题解思路先初始化后,利用DFS递归进行搜索并标记无法放置的位置,不满足条件时进行回溯,此题难点在于回溯与排除无法放置的位置。核心代码放入皇后时对各个方向的数进行标记int dx[8]={-1,-1,-1,0,0,1,1,1};int dy[8]={-1,0,1,-1,1,-1,0,1};void put(int x,int y){ biao[x][y]=1; for(int i=1;i<=n;i原创 2021-03-31 23:04:16 · 184 阅读 · 0 评论