1 条题解
-
0
题解
思路
一个箱子中的硬币数只取决于此前用了多少次坏钥匙。若此前用了 次坏钥匙,则当前能看到的硬币数为 。因此可以把“已使用的坏钥匙次数”作为状态。
由于 ,坏钥匙使用约三十次后,任何箱子的贡献都已经变成零。此后继续区分更大的次数没有意义,可以把这些状态合并。
做法
设状态值表示处理完一个前缀、已经使用若干次坏钥匙时的最大余额。处理下一个箱子时有两种转移:使用好钥匙,获得当前折半后的硬币并支付 ;使用坏钥匙,折半次数加一,并获得再次折半后的当前硬币。
初始时只有“使用零次坏钥匙”的状态为零。依次处理全部箱子,最后取所有状态的最大值。为避免无意义的状态增长,把折半次数在 处合并。
正确性来自逐箱决策的完备枚举:任意合法方案在每个箱子恰好选择一种钥匙,转移分别覆盖这两种选择;状态保留同一折半次数下的最大余额不会损失未来最优方案。超过合并阈值后所有后续硬币贡献均为零,合并也不改变答案。
复杂度
每个箱子只处理常数个折半状态。每个测试用例的时间复杂度为 ,空间复杂度为 ,其中 。
- 1
信息
- ID
- 1105
- 时间
- 3000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者