题意题解每个数有 $3$ 种状态,直接搜索 $O(3^{26})$ 会爆,但折半搜索的 $O(2\times 3^{13})$ 就可以。注意到第一次搜索需要保存两个值 $cnt$ 和 $sum$ ,表示用阶乘的次数以及当前的数。可以用 unordered map 来维护,把第一个值开在外面。#include<bits/stdc++.h>
#define ll long long
...
题意要求构造一个长度为 $n(\le 10^{15})$ 的 $0/1$ 环形序列,满足任意连续 $m(2\le m \le 5)$ 个数的和不超过 $k$ 。求方案数。题解$m$ 比较小,可以状压。可以发现答案其实就是把一个状态往后推 $n$ 次,最后回到自己的方案数。两个状态之间的转移关系 $s[i][j]$ 可以提前预处理出来,然后把 $s$ 看成一个矩阵,合法状态 $i$ 对答案的贡...
题意给出一个 $N\times N$ 的矩形,每个格子染有 $0..5$ 这 $6$ 种颜色。每次操作可以把左上角格子所在的同色联通块全部染成一种颜色,求把所有格子染成一种颜色至少需要多少种操作?$N\le 8$ 。多组数据,组数 $T\le 20$ 。题解朴素的搜索为每次枚举要染的颜色,染色后继续搜索直到染完。退出的条件为某次染色没有新增的格子。期望得分30。#include<bit...
题意给出 $N$ 个砝码,每个砝码的质量至少等于前面两个砝码(也就是质量比它小的砝码中质量最大的两个)的质量的和,求能凑出的 $\le C$ 的重量最大值。$N\le 1000,C\le 2^{30}$ 。题解每个砝码的质量至少等于前面两个砝码的质量的和所以 $N\le 30$ 。。。所以爆搜就行了,拿个前缀和优化剪枝,如果剩下的都能取就直接取完。#include<bits/stdc+...
题意给出一个加法表,一个字母代表一个数字。求加法的进制,以及每个大写字母代表的数字。数字个数 $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]$ 表示每个点可以填字母的情况。每次搜索之前先尽可能找到不合法,或只有一种填法的情况。某个点不能填任何字母则回溯;只能填一个字母则直接向下搜索,搜不到直接退出。某个字母不能填在某一行的任何位置则回溯;只能填在一个位置则向下搜索。列同...
题意在 $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)$ ,操作序列为 ...
时隔一年(差两天)来做还是不会做,甚至连我当时写的是什么都没看懂,这充分凸显了写博客的必要性。题意求 $\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$ 就可以过,不过会成为反向...
题意有一个 $N\times M$ 的长方形迷宫,相邻两个单元之间可能有不能通过的墙或可以用第 $Q_i$ 种钥匙打开的门,有的单元中有第 $Q_i$ 种钥匙。从 $(1,1)$ 出发,目标是 $(N,M)$,每次只能移动一个单元,求最短移动时间。其中 $N,M\le 10$ ,钥匙的种类数 $P\le 10$ 。题解钥匙的种类数不多,考虑直接状压搜索。用 $s[x][y][i]$ 表示 $...
肝总结肝的我肝疼。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...
题解这题数据范围极小,所以直接考虑暴搜。首先预处理一下两个块是否要满足先后关系,如果有就连一条边。判断的标准是纵坐标相等,而且横坐标上有相交的区域。还要对每个块按照纵坐标为第一关键字,横坐标为第二关键字排序,这样可以保证对于上下颜色相等时,可以先涂完上面再继续涂下面而不会漏解。然后进行dfs,每次搜索枚举要涂的颜色,然后把能够涂色的块都涂了。需要注意的是当前颜色和上次涂的颜色不能相等,否则没...