我们要从起点 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)。
为了让序列字典序最小,应尽可能先让前面的元素变小:
小智在一条直线上玩跳跃游戏。起点为 0,终点为 n。每次跳跃的距离必须是一个整数 j,满足 1≤j≤m。他想用最少的跳跃次数恰好到达终点 n。在所有使用最少跳跃次数的方案中,他希望找到字典序最小的一种。
字典序比较规则:从左到右依次比较序列中的数,直到找到第一个不同的位置,该位置上数值较小的序列字典序更小;如果一个是另一个的前缀,则较短的序列字典序较小。
请你帮助小智求出最少跳跃次数,并给出字典序最小的跳跃距离序列。
数据范围:测试数据组数 T 不超过 1000;每组数据中的 n 和 m 满足 5≤n,m≤1000。
By signing up a CodeFun2000 universal account, you can submit code and join discussions in all online judging services provided by us.