一、问题描述
从昏迷中醒来,小明发现自己被关在X星球的废矿车里。 矿车停在平直的废弃的轨道上。 他的面前是两个按钮,分别写着 “F”和 “B”。
小明突然记起来,这两个按钮可以控制矿车在轨道上前进和后退。按F,会前进97米。按B会后退127米。 透过昏暗的灯光,小明看到自己前方1米远正好有个监控探头。他必须设法使得矿车正好停在摄像头的下方,才有机会争取同伴的援助。 或许,通过多次操作F和B可以办到。
矿车上的动力已经不太足,黄色的警示灯在默默闪烁... 每次进行F或B操作都会消耗一定的能量。小明飞快地计算,至少要多少次操作,才能把矿车准确地停在前方 1米远的地方。
请问为了达成目标,最少需要操作的次数是多少。
二、解题思路
假设小明站在x轴上面,坐标为0。前面有两个按钮,按F,前进97米。按B后退127米。向x轴正方向移动+97m,向x轴负方向移动-127米。
求解用最少的移动次数使得最终把小明移动到坐标为1的位置上面。对于这种题,我们依旧可以选择两种方法,第一种暴力求解,第二种巧用条件。
方法一 暴力法
使用两重for循环,第一重表示向前移动97m的次数,第二重表示向后移动127m的次数。限定最大移动次数,找到需要移动最少的一个。
方法二 公式法
在限定的范围内,加上求解最小值公式min(a,b),返回a,b两个中数据较小的一个,max则相反
三、编码实现
1.暴力法
```c++
#include<iostream>//暴力
using namespace std;
int main()
{
int i,j;
for(i=0;i<300;i++)//限定循环次数
{
for(j=0;j<300;j++)
{
if(97i-127j==1)//判断是否符合条件
{
cout<<i<<" "<<j<<" "<<i+j<<"\n"; //输出范围内符合条件的结果
}
}
}
return 0;
}
### 2.公式法
```c++
#include<iostream>//暴力
using namespace std;
int main()
{
int i,j,ans=600;
for(i=0;i<300;i++)//限定循环次数
{
for(j=0;j<300;j++)
{
if(97*i-127*j==1)//判断是否符合条件
{
ans=min(ans,i+j);//公式法在原本输出结果的一行加了一个最小值判断
}
}
}
cout<<ans;//输出结果
return 0;
}
四、输出结果
暴力法符合条件的结果
公式法符合条件的结果
对于求解数值较小,结果靠前的答案暴力法可以解决。而对于数据量较大,推荐使用公式法。