现在小远准备从宿舍走到教室,而从宿舍走到教室的路径可以用一个平面直角坐标系来描述:起点宿舍的坐标位于(1,1)(1,1),而终点教室的坐标呢??小远突然忘记了,他只记得教室的坐标的横坐标乘以纵坐标的乘积为nn,其他的他都忘记了,但是它可以肯定的是从起点(1,1)(1,1)到终点教室存在最短路径!
假设小远目前位于坐标(x,y)(x,y),每次他只能选择向上走一步抵达(x,y+1)(x,y+1),或者向右走一步抵达(x+1,y)(x+1,y)。小远想知道他从起点(1,1)(1,1)开始,往终点走去,所需要的最小步数是多少呢,如果你能帮小远计算出来,那么小远会诚挚地邀请你参加夏令营的线下测试!
输入格式
一行输入一个整数nn,表示终点教室的横坐标乘以纵坐标得到的乘积为nn。
输出格式
输出满足题意的最小步数。
输入数据 1
10
输出数据 1
5
样例1解释
可以发现,当终点的坐标是(2,5)(2,5)时,乘积为2*5=102∗5=10,满足题意。而小远从(1,1)(1,1)走过去可以得到最小的步数,总共是55步:
第①步:从(1,1)(1,1)移动到(2,1)(2,1);
第②步:从(2,1)(2,1)移动到(2,2)(2,2);
第③步:从(2,2)(2,2)移动到(2,3)(2,3);
第④步:从(2,3)(2,3)移动到(2,4)(2,4);
第⑤步:从(2,4)(2,4)移动到(2,5)(2,5);
输入数据 2
50
输出数据 2
13
输入数据 3
10000000019
输出数据 3
10000000018
【以下回答由 GPT 生成】
对于这个问题,我们需要根据给定的n找到满足条件的终点坐标,然后计算从起点到终点的最小步数。
根据题意可知,终点坐标的横坐标乘以纵坐标的乘积为n。我们可以通过循环遍历来找到满足条件的终点坐标。
具体的解决方案如下:
下面是具体的代码实现:
#include <iostream>
using namespace std;
int main() {
int n;
cin >> n;
int x = 1;
int y = 1;
int minSteps = INT_MAX;
for (int i = 2; i * i <= n; i++) {
if (n % i == 0) {
int j = n / i;
int steps = abs(x - i) + abs(y - j);
if (steps < minSteps) {
minSteps = steps;
}
}
}
cout << minSteps << endl;
return 0;
}
使用上述代码可以解决该问题。如果输入的n无法找到满足题意的终点坐标,则输出结果为INT_MAX。
【相关推荐】