题目描述
小F正在进行一个 AB 实验,需要从整数位置 x 移动到整数位置 y。每一步可以将当前位置增加或减少,且每步的增加或减少的值必须是连续的整数(即每步的移动范围是上一步的 -1,+0 或 +1)。首末两步的步长必须是 1。求从 x 到 y 的最少步数。
样例说明
整数位置 x 为 12,另外一个整数位置 y 为 6,我们需要从 x 走到 y,最小的步数为:1,2,2,1,所以我们需要走 4 步。
整数位置 x 为 34,另外一个整数位置 y 为 45,我们需要从 x 走到 y,最小的步数为:1,2,3,2,2,1,所以我们需要走 6 步。
整数位置 x 为 50,另外一个整数位置 y 为 30,我们需要从 x 走到 y,最小的步数为:1,2,3,4,4,3,2,1,所以我们需要走 8 步。
输入格式
输入包含 2 个整数 x,y。(0<=x<=y<2^31)
输出格式 对于每一组数据,输出一行,仅包含一个整数,从 x 到 y 所需最小步数。
输入样例 12 6 34 45 50 30 1 2 3 输出样例 4 6 8
题目解析
位置 x 移动到位置 y,每一步的移动范围是上一步的 -1,+0 或 +1,并且首末两步的步长必须是 1。目标是找到从 x 到 y 的最少步数
贪心的思路是前段加速,后段减速。很容易想到速度的总体变化是一个梯形,可以将问题转化为计算从 0 到 |y - x| 的最少步数,在最后一步的时候记录相对的速度来判断相遇时是否可以一步完成。
分析
为了更好地理解问题,我们可以将其分解为几个部分:
步长变化:每一步的步长只能是上一步的 -1、+0 或 +1。 第一步和最后一步:第一步和最后一步的步长必须是 1。 最小步数:我们需要找到从 x 到 y 的最小步数。 解决方案 我们可以通过以下步骤来解决这个问题:
#include <cmath>
int digui(int distance,int x_step,int y_step)
{
// std::cout<<distance<<' '<<x_step<<' '<<y_step<<std::endl;
if(x_step + y_step ==distance || x_step + y_step + 1 == distance || x_step + y_step + 2 == distance)
{
return 2;
}
else if(x_step == distance||y_step == distance || x_step == distance - 1 || y_step == distance - 1)
return 1;
if(x_step + y_step < distance)
{
++x_step;
++y_step;
}
// std::cout<<distance<<' '<<x_step<<' '<<y_step<<std::endl;
return 2 + digui(distance -x_step - y_step , x_step, y_step);
}
int solution(int xPosition, int yPosition) {
// Please write your code here
// return digui(std::abs(xPosition - yPosition),0,0);
int D = std::abs(xPosition - yPosition);
int steps = 0;
int sum = 0;
while (sum < D || (sum - D) % 2 != 0) {
steps++;
sum += steps;
}
return steps+1;
}
int main() {
// You can add more test cases here
std::cout << (solution(12, 6) == 4) << std::endl;
std::cout << (solution(34, 45) == 6) << std::endl;
std::cout << (solution(50, 30) == 8) << std::endl;
return 0;
}
工具运用
可以采用AI的大思路,实际的代码细节需要自己完成。一开始写这题被卡了好久。