7.19 搜索笔记
题单链接
定期复习。
T1
题目
• 给定一个
• 请你找出若干个环,满足:
•
Solution:
找环模板题,dfs + 栈即可
T2
• 给定一个
• 你需要构造一个括号序列,满足以下条件:
• 保证有解。
•
Solution
• 因为保证有解,所以排列
• 由于括号序列要合法,所以对于每一个环,我们选择了一条边,相邻的边就不能选,所以每个环只有两种情况。
• 考虑最坏情况,每个环仅有两个点,那么时间复杂度为
• 考虑优化。
• 如何判断括号序列是否合法?前缀左括号数量
• 对于两个点一个环的情况,我们将编号小的直接作为左括号,编号大的作为右括号。
• 那么,只存在节点个数
T3
• 给定一个
• 现在需要将其他格子也填上颜色,使得从左上角到右下角的任意路径经过的格子都不会出现两种及以上相同的颜色。
• 路径只能沿着相邻的格子,且只能向下或者向右。
• 计算所有可能的方案,结果对
•
Solution
• 搜索技巧题。
•
• 数据马上降了下来,此时考虑搜索。
• 普通的搜索明显不能通过,我们需要进行优化。
• 我们用状压的方式记录颜色,接着对于每个点,暴力枚举
• 但是这样还是不够,我们需要加上两个显而易见的剪枝。
ps : 复习
T4
• 给定
•
Solution
dfs + 柿子题。
先设
将
上述算法不能通过此题,所以我们考虑剪枝优化。
我们枚举对时,按贡献从高到低枚举,偏差很难由低位补足。也就是说,满足条件的差的序列很少。这时可行性剪枝效果非常出色。我们只需要加一个可行性剪枝即可通过。
int d, ans;
int po[N], to[N][N], suf[N][N];
int dfs(int all, int now, int sum, int res)
{
if (sum + suf[all][now] < d || sum - suf[all][now] > d) return 0;
if (now == (all >> 1))
{
if (abs(d - sum) % (po[all - now] - po[now - 1]) || abs(d - sum) / (po[all - now] - po[now - 1]) > 9) return 0;
int temp = (d - sum) / (po[all - now] - po[now - 1]);
return res * (10 - abs(temp) - (now == 1));
}
int ret = 0;
for (int i = (-9); i <= 9; i ++ )
{
if (now == 1 && i == -9) continue;
int nwp = (po[all - now] - po[now - 1]) * i;
ret += dfs(all, now + 1, sum + nwp, res * (10 - abs(i) - (now == 1)));
}
return ret;
}
void solve()
{
po[0] = 1;
for (int i = 1; i <= 18; i ++ )
{
po[i] = po[i - 1] * 10;
}
for (int i = 2; i <= 18; i ++ )
{
for (int j = 1; j <= (i >> 1); j ++ )
{
to[i][j] = po[i - j] - po[j - 1];
}
}
for (int i = 2; i <= 18; i ++ )
{
for (int j = (i >> 1); j >= 1; j -- ) suf[i][j] = suf[i][j + 1] + to[i][j] * 9;
}
d = read();
for (int i = 2; i <= 18; i ++ )
{
if (i & 1) ans += 10 * dfs(i, 1, 0, 1);
else ans += dfs(i, 1, 0, 1);
}
cout << ans;
}
ps : 没怎么听懂,需要复习
T5
• 我方有
• 现在有
• 问敌方士兵全部死亡的概率是多少?
•
Solution
咕咕咕。
T6
• 有一个监狱,关押着两个犯人。
• 监狱可以看做
• 现在,两个犯人要逃出监狱 (走出矩阵),为了避免打草惊蛇,他们需要尽可能的少开门逃走。
• 问,两个犯人逃出监狱至少要打开多少个门。
•
Solution
咕咕咕。
T7
• 有
• 每次任务给出每个人参与后能得到的分数,每次任务需要两个人完成。
• 为了保证
•
Solution
• 数据不大,先考虑爆搜,最坏复杂度为
• 那么考虑优化,
• 我们先搜索前半部分,设前半部分搜索三个人的分数分别为
• 因此,搜索前半部分记录
• 我们可以用三进制来记录答案,最后输出时对
T8
• 给定一个长度为
• 求是否存在
• 其中
• 请输出任意满足条件的
•
Solution
• 与上题思路类似,同样是折半搜索。
• 将
• 设
• 设
• 需要满足所以
• 只考虑
• 求解
• 如果发现某个
• 时间复杂度为
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通