1 条题解
-
0
自动搬运
来自洛谷,原作者为

我好蒻呀
**搬运于
2025-08-24 21:49:59,当前版本为作者最后更新于2020-02-02 12:36:03,作者可能在搬运后再次修改,您可在原文处查看最新版自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多
以下是正文
给定正整数 ,求用斐波那契数的和或差表示 所需要的斐波那契数数量最小值。
时空限制:
题解界面 LaTeX 渲染可能会有点问题,建议到博客中查看:题解 P3539 【[POI2012]ROZ-Fibonacci Representation】
这题的贪心做法是这样的:每次找到一个离 最近的斐波那契数 ,令 ,重复若干次直到 。(即每次令 )
但是我在网上一直找不到比较好的证明,非常自闭QAQ。
首先有几个性质:
-
存在最优方案,不会选择重复的一项。
证明: 因为我们有 。
-
存在最优方案,不会选择相邻的两项。
证明: 通过讨论可以知道
-
若当前 ,那么存在最优方案,一定包含了 或 。
证明: 反证法。假设不包含 和 。那么根据不选相邻和重复的原则,我们可以证明其他部分的斐波那契数通过加减一定无法凑到 内的数。具体地,我们有 成立,这是因为 和 (为方便设 )。
这样一来, 的数里选出来的和 。同样我们如果用比 大的数拿去减,也会遇到这种的情况: ,并且因为不能选相邻的, 也是没用的。
因此我们就证明了,存在最优方案,一定包含了 或 。
那么接下来,我们就得到了,若当前 ,我们一定要从 中选一个。
接下来我们归纳证明,一定是选较近的那个斐波那契数:
- 显然对于满足 的 ,结论成立。
- 假设对于满足 的 ,结论是成立的,那么接下来考虑证明对于满足 的 ,有结论成立。不妨假设 ,,不失一般性地,设 ,对于 同理。
- 接下来证明令 的策略不比 的策略劣。首先有 。根据 我们有 ,并且因为 ,而 ,因此离 最近的斐波那契数一定是 之一。
- 因为 满足一定选离 较近的斐波那契数,因此我们有 的最优表示中一定有 之一。那么 ,所以 可以由 的表达转化过来,并且 可以和 的表示中的 或是 合并/抵消,因此 均能得到一种不劣于 的表达方式。
至此我们证明了贪心策略的正确性。
显然, 每次至少减少一半,所以答案是 级别的,这也是时间复杂度的级别。
#include <bits/stdc++.h> typedef long long s64; const s64 lim = 4e17; int main() { static s64 f[10001]; int m = 2; f[1] = 1, f[2] = 2; while (f[m] <= lim) { ++m; f[m] = f[m - 2] + f[m - 1]; } int orzczk; std::cin >> orzczk; while (orzczk--) { s64 n; int res = 0; std::cin >> n; while (n) { ++res; int suf = std::upper_bound(f + 1, f + m + 1, n) - f; n = std::min(f[suf] - n, n - f[suf - 1]); } std::cout << res << '\n'; } return 0; } -
- 1
信息
- ID
- 2615
- 时间
- 1000ms
- 内存
- 512MiB
- 难度
- 6
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者