一头大象决定去看朋友,大象住在直线坐标0的位置,而它的朋友则住在直线坐标x(1≤|x|≤106)的位置,大象每走一步可以跨越1、3、5...2m-1中的任何一个数字位置,其中1≤m≤106,那么大象到达朋友处最少需要走多少步?
【输入形式】
输入为一行两个整数x、m,x表示大象朋友所住的位置,m为一个整数。
【输出形式】
输出为一个整数,表示大象到达朋友处最少需要的步数。
本答案参考 多次询问 ChatGPT-3.5 后选择的最佳回答,若是满意,还请采纳,谢谢
#include <iostream>
#include <cmath>
using namespace std;
// 计算最少步数的函数
int minSteps(int x, int m) {
// 取绝对值,因为方向不影响步数
x = abs(x);
int step = 0;
// 从最大的步长开始尝试
for (int i = 2 * m - 1; i >= 1; i -= 2) {
while (x >= i) {
x -= i;
step++;
}
}
// 如果还有剩余距离,再走一步
if (x > 0) step++;
return step;
}
int main() {
int x, m;
cin >> x >> m;
cout << minSteps(x, m) << endl;
return 0;
}
2*m - 1
开始,逐步减小步长(每次减2保持为奇数),尽可能多地减少剩余距离。最后如果还有剩余距离,就再走一步。minSteps
的实现x
的绝对值,因为大象向左或向右走到达朋友处的步数是一样的(只考虑步数,不考虑方向)。for
循环中,从最大的步长2*m - 1
开始,每次减2,直到步长为1。在循环内部的while
循环中,只要剩余距离x
大于等于当前步长i
,就用x
减去i
,并增加步数step
。x
还有剩余(即x>0
),则需要再走一步,所以step
再加1。main
函数部分x
和m
的值,调用minSteps
函数计算最少步数并输出结果。