解题思路与方法
我们要从起点 0 恰好到达终点 n,每次跳跃的距离为 1 到 m。目标是在最少跳跃次数的前提下,输出字典序最小的跳跃距离序列。
-
最少次数:每次最多可以跳 m,因此最少跳跃次数 k=⌈n/m⌉,也可写作 (n+m−1)//m。
-
方案构造:我们需要 k 个正整数之和等于 n,且每个不超过 m。令初始每次都取 m,此时总和为 k×m,比 n 多出 S=k×m−n 。要让总和变为 n,等价于在这 k 个 m 中“减去”总量 S,且每次最多能减 m−1(因为至少要保留 1)。
为了让序列字典序最小,应尽可能先让前面的元素变小:
- 从第 1 次跳跃开始,计算本次能“减掉”的量 δ=min(S,m−1),于是第 1 次实际跳跃距离为 m−δ,并令 S←S−δ。