每日一题——丢失的牛

205 阅读3分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第11天,点击查看活动详情

题目描述

农夫约翰丢掉了他最宝贵的奶牛贝茜,他需要找到她!

幸运的是,农场只有一条长长的小路,约翰知道贝茜一定在这条小路上的某个地方。

如果我们将这条路看作一个数轴,那么约翰当前位于位置 x,贝茜当前位于位置 y(约翰不知道其具体位置)。

如果约翰知道贝茜所处的具体位置,那么只需直接朝她走去,找到她只需行进 |x−y| 的距离。

不幸的是,外面很黑,农夫约翰什么也看不见。

他找到贝茜的唯一办法就是来回走动,直到他最终到达她的位置。

为了找出在搜索过程中来回走动的最佳策略,约翰查阅了计算机科学研究文献,发现这个确切的问题不仅在过去被计算机科学家研究过,而且它实际上被称为“丢失的奶牛问题”(这是真的!)。

农民约翰找到贝茜的推荐行动方式是首先移动到位置 x+1,然后反向移动到位置 x−2,然后移动到位置 x+4,依此类推,以“之字形”模式,每一次移动到的位置与初始位置之间的距离都是上一次移动到的位置与初始位置之间的距离的两倍。

正如他在研究解决丢失奶牛问题的算法时了解到的那样,这种方法保证了在最坏的情况下,找到贝茜之前,他需要行进 9 倍于他与贝茜之间的直接距离的路程。(事实上,相比于其他策略的最坏情况,9 倍于实际距离已经是最好的了)

农夫约翰很想验证这个结果。

给定 x 和 y,请根据上面的“之字形”搜索策略计算直到找到贝茜为止,他将要行进的总距离是多少。

输入格式

共一行,包含两个整数 x,y。

输出格式

输出一个整数,表示总行进距离。

数据范围

0≤x,y≤1000

输入样例:

3 6

输出样例:

9

思路

本题是一道模拟题目,我们根据题意可以得出我们每一次走的路径都是2的n次倍,可以定义一个变量代表农夫,然后让这个变量不断地去走,当他没遇到奶牛之前,走的每一步我们都记录下来。

注意:由于农夫是以“之”字形走路,所以我们可以接著一个变量来决定她走路的方向。

代码

#include <iostream>
#include <algorithm>
#include <cstring>
#include <cmath>using namespace std;
​
const int N = 10010;
​
int main()
{
    int a, b;
    cin >> a >> b;
    int i = a;
    int cnt = 0;
    int result = 0;
    bool flag = false;
    while(i != b)
    {
        if(!flag)
        {
            for(; i < a + pow(2,cnt);i ++)
            {
                if(i != b) result ++;
                else break;
            }
           
            cnt ++;
        }
        else
        {
            for(; i > a - pow(2,cnt);i --)
            {
                if(i != b) result ++;
                else break;
            }
            
            cnt ++;
        }
        flag = !flag;
        
    }
    cout << result << endl;
    return 0;
}