搜索
Ray.C.L
不开longlong见祖宗
展开
-
新年好(最短路+dfs)
思路:先用最短路预处理一下去亲戚家的最短距离,然后暴力搜索最短的拜访顺序。#pragma GCC optimize(2)#include<bits/stdc++.h> using namespace std;typedef long long ll;#define SIS std::ios::sync_with_stdio(false)#define space putchar(' ')#define enter putchar('\n')#define lson root&.原创 2021-01-16 16:13:54 · 214 阅读 · 0 评论 -
回转游戏(IDA*)
思路:求最小的操作数,我们发现每次操作都有4种选择搜索树会很深,那么按操作数去搜索,用IDA*。从题中我们可以看出来这个输入和对应的下标是这样的,在就行8种操作时我们可以发现,他每次操作只会改变一个数的位置,我们先求一下中间8个数中哪个数出现最多为res,那么我们最少最要的操作数就是8-res,吧他作为估价函数。因为求最小的操作数,所以逆操作比如先A后F这样相当于没有变化,所以我们记录一下每种操作对应的逆操作。用下标对应就是0(A)的逆操作是5(F),为了方便移动数字,我们就先把8个操作对应的要修改的.原创 2021-01-14 19:04:16 · 170 阅读 · 0 评论 -
排书(IDA*)
思考:可以抽象为最短路问题,用IDA*做。我们就需要一个估价函数,估价函数要不大于实际步数。我们发现每当进行一次修改就会改变3个地方的后继,当有序时每个数和他的后继满足a[i+1]=a[i]+1,所以我们就可以得出将这个序列修改至有序需要进行几次修改,那么我们就把他当做估价函数,f()=⌈tot3⌉f()=\lceil \frac{tot}3\rceilf()=⌈3tot⌉,我们去枚举的他的修改次数进行迭代加深,当估价函数算出的步数和已经走过的步数加起来大于最大可走的步数无解,估价函数为0表示有解。#.原创 2021-01-14 11:51:46 · 191 阅读 · 0 评论 -
送礼物
思路:看题是个背包,但是W的范围太大,那么就去搜索他的所有方案看哪个最大,这样呢直接搜2462^{46}246会T,那么就通过打表,先求出前一半物品的可行重量方案,然后在搜后半部分,然后去找在背包容量内前一部分有没有合适的方案(这里知道了后部分的可行重量,和总的容纳重量,二分去找前一半中最大可行的是哪一个)。#pragma GCC optimize(2)#include<bits/stdc++.h> using namespace std;typedef long long ll;.原创 2021-01-13 00:05:52 · 164 阅读 · 0 评论 -
加成序列(迭代加深)
思路:满足题设的4个条件,第一个数一定是1,最后的数一定是n,数列单调递增,后面的数是由前面某2个数相加得来的。其中一些条件可以作为可行性剪枝,搜索时,我们去从小到大逐层搜m,因为条件4的的存在,我们会发现如1 2 3 5这种答案和1 2 4 5都是可行的,5可由2+3或者1+4得来那么我们就需要标记一下防止重复搜索。#pragma GCC optimize(2)#include<bits/stdc++.h> using namespace std;typedef long long.原创 2021-01-11 23:15:28 · 142 阅读 · 0 评论 -
生日蛋糕(剪枝)
思路:我们从下往上搜索,也就是从体积和表面积大的向上搜索,我们用R[i]和H[i]记录每一层的高度和半径,在枚举r和h的过程要注意他的取值范围。最小不能小于当前层数,每一层的h,r要小于他下面内层。然后就是剪枝。1. 到目前为止是体积+这一层的体积不能大于总体积。2.到目前为止的面积+这一层的面积不能大于总面积。3.可以通过剩余的体积得出与最小侧面积的不等式。n−v=∑i=0depr[i]2h[i]n-v=\sum_{i=0}^{dep} r[i]^2 h[i]n−v=∑i=0depr[i]2.原创 2021-01-11 11:51:25 · 199 阅读 · 0 评论 -
木棒
思路:经典剪枝,枚举len的长度1.先排序从大到小选木棒2.当一个位置上的木棒无法拼接时那么与其相同长度的木棒都不行3.当拼一个木棍时,如果开头位置的木棒就无法拼接的话,可以直接跳过这种方案4.当拼一个木棍时,如果结尾位置的木棒无法拼接的话,可以直接跳过这种方案代码//#pragma GCC optimize(2)#include<bits/stdc++.h> using namespace std;typedef long long ll;#define SIS std.原创 2021-01-01 11:39:45 · 239 阅读 · 2 评论 -
数独(二进制优化)
思路:暴力数独就是判断行列和3X3的方格内没有重复的数就填一个,这样暴力搜,我们可以发现可用通过一个9位的二进制串表示行列或者3x3的方格内的数有没有用过,比如row[0]=111111111,就表示第1行中1,2,3…,9都没用过,列也相同,3x3的方格表示的特殊一点,原来是9X9的方格,现在我们只需要用个2进制串就能表示一个3X3的方格中的数有没有用过那么我们就可以吧原来的缩成9X9的缩小成3X3的用下标进行映射对应块,所以初始化我们吧这个3个的值都置为全1(1<<9)-1,我们发现在原图.原创 2020-12-23 21:00:25 · 751 阅读 · 0 评论 -
分成互质组
思路:dfs代码#pragma GCC optimize(2)#include<bits/stdc++.h> using namespace std;typedef long long ll;#define SIS std::ios::sync_with_stdio(false)#define space putchar(' ')#define enter putchar('\n')#define lson root<<1#define rson root&l.原创 2020-12-13 15:56:16 · 172 阅读 · 0 评论 -
八数码(A*)
思路:这个题可以直接用BFS写,这里用的A*,八数码有个性质是当且仅当逆序数数对是奇数时无解,利用这个性质判断无解的情况,然后写A*,这里我们要看启发函数f(x),f(x)是到最终状态的距离,本题中可以发现当前每个数到最终态的走向只能是左右或者上线移动那么至少要走的就是每个数到终态的曼哈顿距离。我们知道了启发函数剩下就是写关于这个题的最短路,用unordered_map去记录距离和状态,还要记录来的时候的路径。#pragma GCC optimize(2)#include<bits/stdc++.原创 2020-12-09 23:01:03 · 2542 阅读 · 0 评论 -
第K短路(A*)
思路:要找第K短路,暴力的话就是bfs搜索每一个可以到达的点,那么第K个到终点的距离就是第K短路,这样铁T,对于这种搜索的点巨多的就用A*,A*在最短路问题中,如果所有的边权非负,那么就可以用启发函数来优化bfs过程启发函数是一种函数用来估算当前状态和 目标状态之间的距离,用于路径决策。也就是说,该函数的IQ直接决定了寻找路径的快慢和准确度(accuracy)我们吧f(s)作为启发函数(s到目标点的估算距离),g(s)是从s到目标点的实际距离,要满足f(s)<=g(s),就可以保证当.原创 2020-12-06 20:17:45 · 225 阅读 · 0 评论 -
字串变换(双向BFS)
思路:最小步数模型用BFS去写,但是子串变换的可能是k种那么10步,就是的空间k^10会爆内存,那么用双向广搜优化,A,B同时变化,我们在同一层看有没有A,B可以相互到达的点,如果有那么就是A的距离+B的距离+1,没有就加入搜索,直到这一层搜完。保持两队列大小差不多,当A的小了就去搜A反之//#pragma GCC optimize(2)#include<bits/stdc++.h> using namespace std;typedef long long ll;#define .原创 2020-12-03 11:47:41 · 326 阅读 · 0 评论 -
电路维修(0,1距离最短路)
思路:根据题意我们发现是求最短路,我们可以发现当可以直接到达的点权值为0,不能直接连接的点需要旋转才能连接的权值为1,那么我们再BFS时,看一下我们的下一跳的点,在图中的状态是什么样的,遍历顺序已经对应状态如下图,如果此时下一跳和电路的状态可以对应那么权值是0,否则权值是1,可以发现当答案处于奇数点(行+列%2=1)时是不可能到达的//#pragma GCC optimize(2)#include<bits/stdc++.h> using namespace std;typedef.原创 2020-12-02 23:26:56 · 312 阅读 · 0 评论 -
魔板(bfs)
思路:吧数字转化为子符串然后处理他的3个状态,用个map记录一下有没有访问过这个状态,并在node里记录路径#pragma GCC optimize(2)#include <cstdio>#include <cstring>#include <algorithm>#include <set>#include<iostream>#include<vector>#include<queue>#includ..原创 2020-11-03 19:58:12 · 374 阅读 · 0 评论 -
矩阵距离(多源bfs)
思路:曼哈顿距离那就上下左右四个方向走每次加1,bfs去搜,以所有的1为起点入队开始。#pragma GCC optimize(2)#include <cstdio>#include <cstring>#include <algorithm>#include <set>#include<iostream>#include<vector>#include<queue>#include<map>.原创 2020-11-02 21:03:20 · 237 阅读 · 0 评论 -
武士风度的牛
思路:BFS,是先更新步数然后再看是否入队#pragma GCC optimize(2)#include <cstdio>#include <cstring>#include <algorithm>#include <set>#include<iostream>#include<vector>#include<queue>#include<map>#include<stack>.原创 2020-11-01 20:48:10 · 257 阅读 · 0 评论 -
迷宫问题(打印路径)
思路:BFS具有最短的性质那么,只需要考虑如何打印最短路,我们用个pair的二维数组存储到达当前位置的前一步是哪一步,为了方便输出,我们从n,n点出发到1,1,点#pragma GCC optimize(2)#include <cstdio>#include <cstring>#include <algorithm>#include <set>#include<iostream>#include<vector>#inc.原创 2020-11-01 19:39:35 · 629 阅读 · 0 评论 -
城堡问题
思路:找有几个联通块和最大的大小,难点在于处理图,我们发现西北东南刚好可以转化成二进制位,那么我们就以二进制位为1时表示当前方向有墙,然后BFS老三样,判断边界,判断有没有走过,判断这个地方是不是墙(当前二进制数的第i为是不是1)#pragma GCC optimize(2)#include <cstdio>#include <cstring>#include <algorithm>#include <set>#include<iostre.原创 2020-11-01 14:49:59 · 504 阅读 · 0 评论 -
树的重心
思路:找出每个节点的子树大小,然后求最大值最小#include<bits/stdc++.h>using namespace std;const int N=200005;struct node{ int to,nex;}edge[N];int head[N],cnt;int vis[N];int ans=N;int n;void add(int u,int v){ edge[cnt].to=v; edge[cnt].nex=head[u];..原创 2020-09-07 12:11:33 · 70 阅读 · 0 评论 -
导弹防御系统(dfs贪心)
思路:题目要我们求用多少个上升序列和下降序列打完所有的导弹,dfs找需要多少个上升和下降序列,up记录为上升序列的数量,down记录下降序列的数量,以pos为结尾看能接到那个下降或者上升序列中,如果不能就让up或者down加一#include <cstdio>#include <cstring>#include <algorithm>#include <set>#include<iostream>#include<vector..原创 2020-08-19 14:57:14 · 353 阅读 · 0 评论 -
树上子链(树形dp)
思路:dp[i]表示以i为根节点的子链最大值是多少,i为根时,v为i的子节点,我们可以让i和v两条链相连可得,res=max(res,dp[u]+dp[v]),在dfs的时候不断合并两条链取最大值,然后我们再更新此时的u链看需不需要替换掉上次的内条链,dp[u]=max(dp[u],a[u]+dp[v]),因为可能全为负数所以我们每次最开始取一次啊最大值。#include <cstdio>#include <cstring>#include <algorithm>..原创 2020-08-11 18:46:35 · 626 阅读 · 0 评论 -
二叉苹果树(树形dp)
思路:题中说明这是标准的二叉树,给我们q个枝那说明连了q+1的点,我们就可以吧边的权值用节点去存,用dp[i][j]表示以i为根节点,连了共j个节点的最大值,因为每个节点只有2个或0个子节点,那么我们枚举2个子节点可能连接的节点数,我们先dfs一次去求出每个节点的2个子节点分别是谁,并在此时给节点附上对应的权值转移方程dp[u][i]=max(dp[L][k],dp[R][i-k-1])+dp[u][1] (0<k<i)表示左儿子取k个节点,那么右儿子就取i-k-1个节点(因为还有父亲节点所..原创 2020-08-11 16:00:56 · 590 阅读 · 0 评论 -
紫魔法师(dfs染色)
思路:我们可以发现,当出现3个点构成环时需要用的颜色最多是3种,剩下都可以用2个色完成,当只有1个点的时候只需要1种颜色。dfs的时候判断一下是否有3个点构成环#include <cstdio>#include <cstring>#include <algorithm>#include <set>#include<iostream>#include<vector>#include<queue>//#incl.原创 2020-08-07 15:30:28 · 359 阅读 · 0 评论 -
DDos(记忆化搜索)
思路:因为数据包可以在任何时间发送,那么最后接收到的数据包的数量就是1-n有多少条路径,dp[i]表示从i到n有多少条路径,dp[n]=1,然后记忆化搜索。#include <cstdio>#include <cstring>#include <algorithm>#include <set>#include<iostream>#include<vector>#include<queue>//#includ.原创 2020-08-05 11:21:44 · 120 阅读 · 0 评论 -
HDU-6772 Lead of Wisdom(dfs)
思路:dfs,用个三维数组保存挂饰的所有信息,这样dfs的时候就不用检查这个挂饰有没有用过。(因为这个T了)AC代码#include <cstdio>#include <cstring>#include <algorithm>#include <set>#include<iostream>#include<vector>#include<queue>//#include<bits/stdc++.h&g原创 2020-07-24 15:14:22 · 249 阅读 · 0 评论 -
【SCOI2009】生日快乐(dfs+思维)
思路:我们用dfs去想,首先如果此时只有一个人那我们就直接返回答案,dfs(x,y,n)表示边长为x,y,切给n个人长边与短边之比最大值最小的值是多少,为了保证面积相同每次切若沿着x切必定是x/n的倍数若沿着y切必定是y/n的倍数,我们要看切完后分给多少个人,就看他当前切的是多少倍,然后我们按X,Y去切就行了求他们的最大值最小#include <cstdio>#include <cstring>#include <algorithm>#include <s.原创 2020-07-16 13:31:08 · 308 阅读 · 0 评论 -
几乎毁灭牛市的流星雨(BFS)
思路:这是个BFS,我们去记录他每个陨石坑和烧毁地方的时间这里有一个坑点是要记录最先到,然后我们每次走的地方所到达的时间要小于陨石或者烧毁的地方。#include <cstdio>#include <cstring>#include <algorithm>#include <set>#include<iostream>#include<vector>#include<bits/stdc++.h>using..原创 2020-07-11 19:19:57 · 221 阅读 · 0 评论 -
滑雪(记忆化搜索)
思路:我们用dp[i][j]表示从i,j为起点可以滑的长度,dp[i][j]可以往4个方向滑(若都合法)所以我们对这4个方向dfs。#include <cstdio>#include <cstring>#include <algorithm>#include <set>#include<iostream>//#include<bits/stdc++.h>using namespace std;typedef long .原创 2020-06-11 18:04:40 · 172 阅读 · 0 评论 -
牛客每日一题-小A与小B(BFS)
思路:BFS模板题想到吧小B的一次走两步转化为连着BFS两次即可。(输入中间有空格)#include <cstdio>#include <cstring>#include <algorithm>#include <set>#include<bits/stdc++.h>using namespace std;typedef long long ll;#define space putchar(' ')#define enter p.原创 2020-06-05 17:21:12 · 341 阅读 · 0 评论 -
Flip Game(DFS,二进制枚举)
题意:给你4X4的矩阵按一下b将会改变自己和上下左右5个按钮为w,反之亦然。因为数据只是4X4所以直接DFS(也可以二进制枚举 )#include <cstdio>#include <cstring>#include <algorithm>#include <set>//#include<bits/stdc++.h>using namespace std;typedef long long ll;#define space pu..原创 2020-05-22 15:07:00 · 319 阅读 · 1 评论 -
棋盘覆盖
棋盘覆盖:用4种不同的L型骨牌覆盖一个给定的特殊棋盘(即特殊方格的位置已经确定了)上除去特殊方格外的所有方格,且任何两个L型骨牌不得重复覆盖,按照规则,我们很容易知道,在2k*2k的棋盘覆盖中,用到的L型骨盘数恰为(4^k-1)/3,即(所有方格个数-特殊方格个数)/3实现这种算法的分析:每次都对分割后的四个小方块进行判断,判断特殊方格是否在里面。这里的判断的方法是每次先记录下整个大方块的左上角...原创 2020-04-30 11:46:32 · 294 阅读 · 0 评论 -
马踏棋盘
思路:DFS(效率低下)(这种**题我特么能写这么长时间,中间一个多写了个step++看了半天没看出来问题)#include <iostream>using namespace std;int dir[8][2]= {{1,2},{2,1},{2,-1},{-1,2},{1,-2},{-1,-2},{-2,-1},{-2,1}};int vis[50][50];int ...原创 2019-10-13 14:19:25 · 168 阅读 · 0 评论 -
Borg Maze POJ - 3026(需要多看)
题意求S到A吧A全吃了要最少多少步思路先BFS每个A-S S-A的距离简图求最小生成树(我特么BFSyy写成了xx看了一个小时没发现菜的真实,特么这个东西搞了我3个小时我还是退群吧)#include <algorithm> #include <iostream> #include <cstring> #include <iomani...原创 2019-09-13 12:30:56 · 142 阅读 · 0 评论 -
Prime Path POJ - 3126(BFS+素数打表)
水题bfs模板分离四位数素数打表每次只能改变一位要保存原来的数,,,#include <iostream>#include <cstdio>#include <fstream>#include <algorithm>#include <cmath>#include <deque>#include <ve...原创 2019-07-31 16:38:41 · 132 阅读 · 0 评论