学生思维链 · 问题串
这份文档不是题解,不给公式、证明和代码。每题是一串问题:先自己想,写下答案,再点开提示对照。提示只把你往下一个方向上带,不含最终结论。
建议用法:拿一张纸,按顺序把每个问题用自己的话写一句。写不出来时,先点开提示,再合上,重新写。
1. 收集金币(D0796)
题目链接:https://oj.33dai.cn/p/D0796
- 题目把“第 0 秒谁生成、以后每一秒怎样由上一秒决定”都写全了吗?如果写全了,最直接、保证正确的做法是什么?
- 按定义模拟时,如果你“边算边把新结果写回原表”,同一秒里先更新的格子会不会影响后更新的格子?这会带来什么后果?
- 题目问的是“最终恰好 x 次”,不是“某一秒谁亮着”。这是不是在暗示:整张棋盘每一秒的状态,多数其实用不上?
- 那就把问题缩到“一个格子自己的时间线”。一个格子会不会“生成、停、又生成”?它停下来的原因,是它自己上一秒没生成,还是某个邻居没生成?
- “恰好生成 x 次”和“在某一秒停下”是不是同一件事?如果是,能不能把“恰好 x 次的格子”理解成“某一秒新停下的那批格子”?
- 圈出每一秒新停下的格子,它们在位置上有什么共同点?不同秒的几批会重叠或漏掉吗?
卡住了?点开一句提示
把“一个格子生成几次”换成“它第几秒停止”,再从位置出发给这个秒数找一个简单表达式——先猜,再在 4×4 小棋盘上核对。
2. 收集金币 2(D0808)
题目链接:https://oj.33dai.cn/p/D0808
- 先别管怎么算。和上一题相比,规则有哪几处不一样?逐条列出来。
- 上一题有“自己上一秒也要生成”这条,本题没有。那么“停了就永远不会再生”这个结论,在本题还能直接用吗?
- 题目特意说“四个斜邻居都要在棋盘内”。这句话把哪些格子和哪些格子分开了?谁凑不齐四个斜邻居?
- 边界上的格子第二次还会生成吗?紧挨边界的内圈呢?边界的影响会不会一层一层往里退?
- 每一秒“还能生成”的区域,能不能用一个规整的形状描述?这个形状每过一秒怎么变?
- “恰好 x 次”有几种数法?比较“直接数一圈”和“至少 x 次减去至少 x+1 次”,哪种要处理的特殊情况少?
卡住了?点开一句提示
先画 5×6 棋盘的前三秒,看“还在生成的区域”长什么样;再用“矩形差”的思路想想计数,别急着写内缩公式。
3. 相邻配对(D0957)
题目链接:https://oj.33dai.cn/p/D0957
- 每次操作对相邻两堆做了什么?两堆分别满足什么前提?
- 最直接的“枚举所有操作选择”能验证小例子,但它有什么问题?(想两件事:操作次数、状态重复)
- 每次是“相邻两堆各减 1”。哪些量在操作前后不会改变?试着找两个。
- 这些不变量能判断“有解”吗?拿
[1,0,0,1]检验一下:它满足不变量吗?它做得了哪怕一步吗? - 第一堆有几个邻居?和中间的堆比,它的“选择”是多还是少?约束最紧的地方,会不会反而被逼出唯一答案?
- 要清空第一堆,只能靠哪一对?这一对必须做几次?第二堆不够时会怎样?
- 如果第二堆够,先把这批消耗扣掉;剩下的部分,和你一开始遇到的问题是不是同一类?
卡住了?点开一句提示
从“端点只有唯一邻居”出发,先问“第一条边的次数是不是被强迫的”,再想能不能一层层往右推。
4. 环形配对(D0958)
题目链接:https://oj.33dai.cn/p/D0958
- 和上一题相比,只多了哪一条规则?就这一条,让上一题最关键的抓手为什么失效了?
- 直接“随便剪开当链”会怎样?拿三堆
[2,3,3]试,链的结论和环的真实答案一致吗?差在哪? - 每一步还是消耗 2 颗糖,“总数必须是偶数”这条还在吗?
- 上一题的奇偶不变量,到环上还能照抄吗?接首尾的那条边,在 n 为偶数、n 为奇数时,分别接的是什么位置?
- 环上没有天然起点,能不能反过来:先挑一对相邻的堆,把它们的操作次数设成一个未知量?
- 设了这个未知量之后,其余每对的操作次数能不能被唯一推出来?每条边“次数不能为负”会给这个未知量上界还是下界?
- 求出一组次数就算完事了吗?这套次数真的能被一步一步执行出来吗?
卡住了?点开一句提示
先用反例说明“剪开”不行,再想“设一个未知量、把其余次数用它的表达式写出、把非负变成范围”,最后别忘了闭环和执行。
5. 仓库货位(D0928)
题目链接:https://oj.33dai.cn/p/D0928
- “关键货位”的定义本身,能不能直接照做?“删一个点、再搜一遍”慢在哪?
- “删点破坏连通”让你想到学过的哪个概念?但本题的移动规则和它有什么根本不同?
- 全为 1 的 2×3 棋盘里,第一行中间那格是不是关键货位?忽略方向看它是割点吗?这说明了什么?
- Z 关键,意味着有某对端点的所有路径都经过它。那么进 Z 前、出 Z 后,是不是一定各经过 Z 的一个紧邻点?
- 能不能用这两个近处的紧邻点 P、Q,代替远处那对端点?如果 P 能绕过 Z 到 Q,整条路径是不是也能绕开 Z?反过来呢?
- 坐标只能加 1,P 到 Q 相差两步。那么 P 到 Q 的路径是不是都被限死了?还需要搜整张图吗?
卡住了?点开一句提示
先用“删点比较”当基准,再用 2×3 反例排除无向割点;接着想“把端点换成 Z 的邻居”,最后用“坐标只增”把绕行压到最小。
6. 两端删除(D0940)
题目链接:https://oj.33dai.cn/p/D0940
- “从左右两端删”最后剩下的,一定是原串的什么结构?原串的每一段连续子串,都能通过某种删法得到吗?
- 代价里 A 数的是什么?B 数的是什么?两者数的是同一类字符吗?
- 要求的是 max(A,B) 的最小值。能不能换个问法:“给定上限 k,能不能让两项都 ≤k?”
- 这个“上限 k 行不行”,是不是 k 越大越容易满足?这种性质适合用什么方法找最小的可行 k?
- A≤k、B≤k 各自能翻译成“区间里 0 的个数、1 的个数”的什么限制?
- 判断某个 k 时,同一个右端点下满足“0 的个数”条件的区间可能有多个。其中是不是有一个“最长”的能代表其余?为什么只检查它就不漏解?
- 维护这个窗口时,左端点会来回跑吗?为什么?
卡住了?点开一句提示
主线是:把“最小化 max”变成“上限 k 行不行”,再把两个条件翻成区间计数,用一个只会向右走的窗口去判定。想清楚“只查一个窗口为什么不漏”。
还卡着?再点开(补充方向)
把 A、B 的表达式并排写出来相减,看看能不能发现和“区间长度”有关的新结构。这是补充方向,先别当主线。
7. 反子序列(D0952)
题目链接:https://oj.33dai.cn/p/D0952
- 题目有哪两个目标?它们会不会互相打架?
- “每个位置选一个字符,直接搜”能写清楚约束,但它的代价大概是多少?同一种字母的多个副本要不要区分?什么时候能提前判断“后面已经不可能完成”?
- 先把袋子里的字符排序,通常能得到字典序最小的排列——它一定包含 t 吗?找个反例。
- 先把 t 原样摆进去,就满足了“子序列”——它一定是字典序最小的吗?找个反例。
- 所有候选串长度一样,字典序由“第一个不同的位置”决定。那从左往右逐位确定,是不是自然?
- 逐位时优先试最小的字符,但必须确认它“没把后面堵死”。已拼好前缀后,怎么判断剩余部分还能不能补完?(想:还差 t 的哪些字符、还剩几个位置、每种字符还剩多少)
- 如果某个字符能通过“补完检查”,为什么选它一定安全?逐位都这么选,为什么整体就是最小?
卡住了?点开一句提示
先给“排序”和“先摆 t”各找一个反例;再推出“给定前缀后能否补完”的判据;最后在“能补完”的候选里逐位取最小。