0
点赞
收藏
分享

微信扫一扫

算法题每日一练---第3天:一步之遥

一、问题描述

从昏迷中醒来,小明发现自己被关在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;
}

四、输出结果

暴力法符合条件的结果

1.png

公式法符合条件的结果

2.png

对于求解数值较小,结果靠前的答案暴力法可以解决。而对于数据量较大,推荐使用公式法。

举报

相关推荐

0 条评论