标签:算法-搜索

题意给出一个 $N\times N$ 的矩形,每个格子染有 $0..5$ 这 $6$ 种颜色。每次操作可以把左上角格子所在的同色联通块全部染成一种颜色,求把所有格子染成一种颜色至少需要多少种操作?$N\le 8$ 。多组数据,组数 $T\le 20$ 。题解朴素的搜索为每次枚举要染的颜色,染色后继续搜索直到染完。退出的条件为某次染色没有新增的格子。期望得分30。#include<bit...
题解 算法-搜索
省选/NOI-
题意给出 $N$ 个砝码,每个砝码的质量至少等于前面两个砝码(也就是质量比它小的砝码中质量最大的两个)的质量的和,求能凑出的 $\le C$ 的重量最大值。$N\le 1000,C\le 2^{30}$ 。题解每个砝码的质量至少等于前面两个砝码的质量的和所以 $N\le 30$ 。。。所以爆搜就行了,拿个前缀和优化剪枝,如果剩下的都能取就直接取完。#include<bits/stdc+...
题解 算法-搜索
省选/NOI-
题意给出一个加法表,一个字母代表一个数字。求加法的进制,以及每个大写字母代表的数字。数字个数 $N\le 8$ 。(行数 $\le 9$)题解结论:一定是 $N$ 进制。每一行有几个二位数,这个数就是几。证明:因为有 $N$ 个不同的数,所以最少 $N$ 进制。假设为 $N+1$ 进制,那么一定有一个数没有出现,假设为 $k$ 。$k=0$ 或 $k=1$,而 $1+N=10$ ,矛盾。$1...
题解 算法-搜索
提高+/省选-
开始爆肝题解题意给出一个 $N$ 进制加法的竖式,一个大写字母代表一个数字。求每个大写字母代表的数字。$N\le 26$ 。题解直接爆搜。从右往左一次搜各个竖排,如果搜到就退出。要开 O2 并且优化搜索顺序(就是把每个竖排的第一个数倒叙搜索,可以通过分析数据点得出)才能过,而且 #9 刚好 $1000ms$ ,真是刺激。#include<bits/stdc++.h> using...
题解 算法-搜索
提高+/省选-
双倍经验:SP1110题意填一个 $16\times 16$ 的数独。多组数据。题解状压优化搜索+剪枝。用 $16$ 位二进制数 $\text{ok}[i][j]$ 表示每个点可以填字母的情况。每次搜索之前先尽可能找到不合法,或只有一种填法的情况。某个点不能填任何字母则回溯;只能填一个字母则直接向下搜索,搜不到直接退出。某个字母不能填在某一行的任何位置则回溯;只能填在一个位置则向下搜索。列同...
题解 算法-搜索 算法-状态压缩
NOI/NOI+/CTSC
题意在 $R\times C$ 的含障碍的图上把箱子从起点推到终点,人一开始在另一个起点,求人的最短路径。多组数据。$R,C\le 20$题解显然箱子是连续移动的,但人有时需要绕一圈去箱子的背面,所以先对箱子做 $\text{bfs1}$ 。保存一个五元组 $(b_x,b_y,m_x,m_y,now)$ ,表示当前箱子在 $(b_x,b_y)$ ,人在 $(m_x,m_y)$ ,操作序列为 ...
题解 算法-搜索
省选/NOI-
时隔一年(差两天)来做还是不会做,甚至连我当时写的是什么都没看懂,这充分凸显了写博客的必要性。题意求 $\le N$ 的最大数 $x$ ,满足 $\forall 1\le i\le x$ ,$i$ 的约数个数 $<$ $x$ 的约数个数。题解直接上搜索。先预处理可能会被用到的质数表,对于每个质数,搜索它可能会被用几次,最后如果约数个数大于当前最大值 或 约数个数相等但数值较小 都对答案...
题解 算法-搜索 数学
提高+/省选-
题意给一个 $N\times N$ 网格图,汽车从 $(1,1)$ 走到 $(N,N)$ 。网格图中有加油站,汽车到了加油站就会被强制加油花费 $A$ ;如果没油了也可以设立一个油库并加油,花费 $C+A$ ;如果往回走( $X,Y$ 坐标有一个减小)会花费 $B$ 。汽车邮箱容量为 $K$ ,每走一条边消耗 $1$ 单位的油。求花费的最小值。题解朴素的 $bfs$ 就可以过,不过会成为反向...
题解 算法-搜索 题目-网络流24题
省选/NOI-
题意有一个 $N\times M$ 的长方形迷宫,相邻两个单元之间可能有不能通过的墙或可以用第 $Q_i$ 种钥匙打开的门,有的单元中有第 $Q_i$ 种钥匙。从 $(1,1)$ 出发,目标是 $(N,M)$,每次只能移动一个单元,求最短移动时间。其中 $N,M\le 10$ ,钥匙的种类数 $P\le 10$ 。题解钥匙的种类数不多,考虑直接状压搜索。用 $s[x][y][i]$ 表示 $...
题解 算法-搜索 算法-状态压缩 题目-网络流24题
省选/NOI-
肝总结肝的我肝疼。10026.电路维修把题意转化一下,可以把每个端点看成节点,有导线相连的对角线就连一条边权为0的边,不相连的对角线就连一条边权为1的边。然后用最短路什么的做就行了。看题解里面说最短路比较慢,再加上本来就该练习广搜,我就写了双向广搜。struct Edge{ int next,to,w,from; } edge[1000005]; int n,m,t,cnt,head...
题解 算法-搜索 题目-一本通
众所周知,人类的本质是鸽子。10018.数的划分水题。 int ans,n,k; void dfs(int num,int sum,int now) { if (now==k) { if (sum==n) ans++; return; } int mx=n-sum-k+now+1; for (int i=num;i&l...
题解 算法-搜索 题目-一本通
读题读了十多分钟才读懂,辣鸡ybt翻译。需要注意的关于题意的点:移动和点击都要算作次数最后还要打印*换行符每个方向直接移动到最近的不同的点,如果没有就不移动做法就是基础的bfs,不过需要预处理一下每个点向四个方向移动的下一个点,直接暴力做即可。剪枝是如果当前在打印文本的位置 $>$ 之前搜索过的同一个点位置就退出。#include<bits/stdc++.h> #defin...
题解 算法-搜索
省选/NOI-
题解这题数据范围极小,所以直接考虑暴搜。首先预处理一下两个块是否要满足先后关系,如果有就连一条边。判断的标准是纵坐标相等,而且横坐标上有相交的区域。还要对每个块按照纵坐标为第一关键字,横坐标为第二关键字排序,这样可以保证对于上下颜色相等时,可以先涂完上面再继续涂下面而不会漏解。然后进行dfs,每次搜索枚举要涂的颜色,然后把能够涂色的块都涂了。需要注意的是当前颜色和上次涂的颜色不能相等,否则没...
题解 算法-搜索
提高+/省选-
一开始我还用拓扑删链然后瞎搞,后来发现环可能是有交叉的,这就意味着不可能直接通过搜索一个个的环来得到答案。所以我最开始的做法只有10分。然后看了题解,发现数据有点水,直接 $O(n^{2})$ 搜索搞就完事。struct Edge{ int next,to,w; } edge[105]; int head[55],cnt,n,m,t,a,b,c; bool vis[55],ans; ...
题解 算法-搜索
提高+/省选-
日推水题系列。对于每一个子树,每个叶节点对答案的贡献就是 根到所有叶节点距离的最大值 $dismax$ 减去 根到这个叶节点的距离 $dis[x]$。直接dfs即可。注意要开long long,我又被坑了一次。struct Edge{ ll next,to,w; } edge[1000005]; ll head[500005],cnt,n,m,s,a,b,c,dis[500005],...
题解 算法-搜索
提高+/省选-