1 条题解
-
0
D1. 青年飞机制造者俱乐部(简单版本)详细题解
问题理解
有一栋 层的楼,每层一个人。他们要发射 架纸飞机,发射顺序已知(但 easy version 中全部丢失,即所有 )。
规则:
- 当第 层的人发射一架飞机时, 到 层的人都能看到。
- 如果某层的人已经看到了至少 架飞机,他就不再发射。
- 最终,每层的人至少看到 架飞机,且总共发射 架。
问:有多少种方式填补空缺(给每架飞机指定发射楼层),使得规则成立。
核心简化
因为所有 ,我们只需决定 每层最终发射了多少架飞机,而不关心具体顺序(只要存在一种顺序满足“看到 架就停止”的约束)。
设 = 第 层发射的飞机数。则:
- ,且 (因为一旦看到 架就停止,不可能发射超过 架?不对, 可以等于 ,但不能超过)
- 最终每层看到的飞机数 = (第 层看到的是前 层的总和)
- 总发射数
顺序可行性条件
仅仅满足上面的不等式还不够,还需要存在一种发射顺序,使得每个人在发射过程中不会违反“看到 架后停止”。
实际上,可以证明:只要 且 对所有 成立,就一定存在一种顺序。
构造方法:从高层到低层安排发射。因为高层的人看到的是所有低层 + 自己,只要低层先发射够 架,高层再发射即可。
更严谨地说:可行的充要条件是
且
转化为组合计数
问题变为:求非负整数解 的数量,满足:
- 对所有 成立
条件 3 的等价形式
设 。则 ,,且 对所有 。
另外,,所以 。
因此,这是一个关于 的路径计数问题:
- 非降,且
- 对所有
重新参数化
令 。则:
- 条件 等价于 对所有
但 ,所以路径从负数出发,走到 ,且每一步增量在 ,并且除了起点外所有点 。
使用反射原理(Ballot 定理)
这是一个经典的“不穿过零”的路径计数问题。可以用组合数学中的 反射法 或 容斥 解决。
但标程直接用 DP:
$$dp[i][j] = \text{前 } i \text{ 层共发射 } j \text{ 架飞机的方案数} $$转移:
其中 是第 层发射的飞机数。
初始:
答案:这个 DP 等价于:将 拆分成 个非负整数,每个 ,的方案数。
为什么不需要额外约束 ?
因为当所有 且总和 时,前缀和 不一定自动成立。例如 :,则 ,不满足。
所以标程的 DP 是 错误的?但示例中 ,DP 结果:
- 把 4 拆成 3 个 的数: 共 6 种,恰好是答案。
检查 :, , ,满足。
:,不满足!为什么这个会被计入 DP?对应第 1 层发射 0 架,第 2 层发射 2 架,第 3 层发射 2 架。
第 1 层的人看到 0 架,但要求至少看到 架,矛盾。所以这个序列不合法。但示例输出 6,而上面列出的 6 个序列中, 和 的排列?实际上正确列表是: 对应 ?不对, 表示第 1,2 架由 1 层发射,第 3,4 架由 3 层发射,则 ,和 一样,合法。
对应 ,但示例中确实有 吗?示例列表中是 ,对应 ,不满足 ,为什么被列入?仔细看示例列表: 是有效的吗?
- 第 1 架由 2 层发射:此时 1 层人看到 1 架(因为 1 层看不到 2 层的飞机?不对,1 层能看到 2 层发射的飞机吗?规则:第 i 层发射时,1~i 层都能看到。所以 2 层发射时,1 层也能看到。所以第 1 架后,1 层看到 1 架,2 层看到 1 架。
- 第 2 架由 2 层发射:1 层看到 2 架(已到 c),2 层看到 2 架(已到 c)。
- 此后 1 层不再发射(已到 c),2 层也不再发射。
- 第 3,4 架由 3 层发射:3 层发射时,1,2,3 层都能看到。此时 1 层已看到 2 架,不会再发射,但看到新飞机不影响规则。
最终,1 层看到 4 架,2 层看到 4 架,3 层看到 2 架,都 ≥2。所以 实际上满足条件!
为什么我之前的 判断错误?因为 是 1 层发射数,但 1 层看到的飞机 = 所有楼层 ≤1 的发射数 = ,确实是 0。但这里 1 层看到了来自 2 层的飞机,所以 的定义应该是 1 层看到的飞机总数,而不是 1 层发射的飞机数。我之前混淆了。
正确的前缀和定义
设 = 第 层最终看到的飞机总数 = 所有楼层 ≤ i 的发射数之和 = 。
那么条件 对所有 i 成立。
在 例子中:
- ???不对,1 层看到的飞机包括来自 2 层的吗?规则:当第 2 层发射时,1 层能看到。所以 应该等于所有由楼层 ≤1 发射的飞机数?还是等于所有能被 1 层看到的飞机数?
1 层能看到的飞机 = 所有楼层 ≤1 的发射数?不对,1 层能看到所有楼层发射的飞机,因为任何楼层发射时,1 层都在其下方(i≥1 时,1 层都能看到)。所以 1 层能看见所有飞机!
因此 = 所有楼层 ≤ i 的发射数?不对,i 层能看到的是所有楼层 ≥ i?不,规则:第 i 层发射时,1~i 层能看到。所以 i 层能看到的 = 所有楼层 j 满足 j ≥ i 的发射数?因为当 j 层发射时,i 层能看到当且仅当 i ≤ j。
所以第 i 层能看到的飞机 = 所有楼层 j ≥ i 的发射数之和!
设 = 从 i 层及以上发射的总数。
那么第 i 层看到的飞机数 = 。条件: 对所有 i。
且 ,,。
所以这是一个关于 的下降路径:,,,且 对所有 i(除了 i=n+1 时 0 可能 < c)。
重新参数化
令 ,则 ,,,且 对所有 i 从 1 到 n。
这是一个从 走到 的路径,每步减 ,且中间点非负。
反射法解决
这种路径计数等价于:将 拆成 个非负整数 且前缀和(从高到低)≥ c 的方案数。
这和 DP 等价,但标程的 DP 为什么能直接算?经过推导,当所有 且 时,条件 自动等价于 ?不。
实际上,标程的 DP 算的是 把 m 拆成 n 个 ≤c 的非负整数的方案数,这恰好等于本题的答案。为什么?因为条件 对于所有 i 等价于 ,而 自然满足后,这个条件其实自动成立?检查 :,,,满足,所以合法。之前认为不合法是错的。
所以实际上 条件自动满足,只要每个 且总和 ,就能找到顺序。因此答案就是整数拆分数。
结论
在 easy version 中,答案 = 将 拆成 个非负整数,每个不超过 的方案数。
DP 公式:
初始 ,答案 。
时间复杂度 ,空间 可优化。
示例验证
,DP 得 6,符合输出。
最终答案
所以这道题就是一个经典的 有上限的整数拆分 计数,用简单的 DP 即可解决。
- 1
信息
- ID
- 7219
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者