解题思路
原问题要求从坐标 x 移动到坐标 y(x≤y),每次可以向右移动一个 2 的幂次(即 1,2,4,8,…),求最少操作次数。
- 由于每次移动的距离都是 2 的幂次,问题等价于:用最少的 2 的幂次之和表示差值 d=y−x。
- 根据整数的二进制表示唯一性,任意非负整数 d 可以唯一地写成若干个不同的 2 的幂次之和。贪心地选择不超过当前剩余距离的最大 2k 移动,最终使用的步数正好等于 d 的二进制表示中 1 的个数。
- 因此,答案就是 y−x 的二进制位中 1 的数量(
popcount)。
复杂度分析