- #include
- using namespace std;
- int solution(int xPosition, int yPosition) {
- //数学方法 找规律 求解
- int l = abs(xPosition-yPosition); //绝对距离
- int i = 0; //到底所需的当前步数
- int k = 0; //可活动步数
- while(true){
- k+=(i+1)/2;;
- if(l<=k) return i;
- i++;
- }
- }
- int main() {
- // You can add more test cases here
- cout << (solution(12, 6) == 4) << endl;
- cout << (solution(34, 45) == 6) << endl;
- cout << (solution(50, 30) == 8) << endl;
- return 0;
- }
题目解析
-
位置的变化:
- 你从位置
x出发,目标是到达位置y。 - 每一步的移动是有限制的:上一步的步长可以减小
1,不变0,或增加1。 - 首末两步的步长必须是 1,意味着从
x到y的第一步和最后一步的步长一定是 1。
- 你从位置
-
步长递增:
- 每一步的步长是可以逐渐变化的,但每一步的步长要满足连续整数的条件。
- 比如第一步可以走 1,第二步可以走 1 或 2,第三步可以走 2 或 3,依此类推。
-
问题本质:
- 我们的问题本质是:通过一系列连续变化的步长从
x到y,找到最小的步数。
- 我们的问题本质是:通过一系列连续变化的步长从
步骤和策略
-
最小步数的计算:
- 首先,计算出目标位置
y和起始位置x之间的距离,即distance = |y - x|。如果distance == 0,意味着起点和终点相同,步数是 0。
- 首先,计算出目标位置
-
步长递增的规律:
- 由于每步的步长是一个递增的连续整数,步长可以从
1开始,然后逐步增加。每一步的步长必须是上一步的-1、0或+1,且首末两步的步长固定为 1。
- 由于每步的步长是一个递增的连续整数,步长可以从
-
思路:
- 假设我们已经走了
k步,且当前已移动的总距离是S。每一步的步长是递增的,即第i步的步长是i。我们需要找到一个最小的k,使得走完的总步长大于或等于distance。
- 假设我们已经走了
-
总结规律:
- 可以从
1开始步进,逐步增加步长,并累计已走的距离。当累计的距离超过或等于目标distance时,我们即找到了最小的步数。
- 可以从
解题步骤
- 计算
distance = |y - x|。 - 逐步增加步长,直到累计的步长大于或等于
distance。 - 输出需要的最小步数。
我的代码的核心逻辑是:
- 计算起始和目标之间的距离
l。 - 每次增加步数,步长是
(i + 1) / 2,并将其累加到总距离k中。 - 一旦
k达到或超过l,返回当前步数i。
3. 累加步长并检查是否满足条件
while(true){ k += (i + 1) / 2; // 累加步长 if (l <= k) return i; // 如果已经足够距离,返回步数 i++; // 增加步数 }
k += (i + 1) / 2;:每次你累加i + 1的一半到总距离k。这意味着你每次累加的步长并不是逐步增加的整数值,而是(i + 1) / 2。因此,每步的实际增加量并非预期的递增步长,而是对i的处理。if (l <= k) return i;:当k已经足够覆盖目标距离l时,返回当前的步数i。i++:步数递增,继续进行下一轮计算。