失去的母牛

来源:互联网 发布:跳舞毯软件 编辑:程序博客网 时间:2024/04/30 10:04

失去的母牛

文件名(lostcow.cpp

题目描述

FJ丢失了他引以为傲的牛Bessie,他必须找到他!
  幸运的是,农场间只有一条长路径,而且FJ知道Bessie会在这条路的一些点上。如果我们把这条路看作一条数轴,那么FJ现在在x点上,而Bessie在y点上(FJ不确定)。如果FJ只知道Bessie大致在哪里,他只能径直向它走|x-y|的距离。不幸的是,由于黑山老树精的出没,外面很黑,FJ看不见任何东西。他唯一能找到Bessie的办法是来回走动直到他最终到达了Bessie所在的位置。
    为了找出搜索的最佳方案,FJ咨询了信息大佬——Aico(黄加瑜)。Aico告诉他这是个经典的计算机问题,叫做“Lost Cow Problem”(丢失牛问题)(这是真的!)。
    FJ找牛的最佳方案是先移动到x+1的位置,然后反向移动到x-2,接着是x+4,以此类推。在一个“之字形”模式中,他每一步移动后离起点的距离是上一步时离起点距离的两倍x+1x-2x+4。正如他在学习“丢失牛问题”算法时一样,这种方式能让他在最坏情况下总共走9倍的实际距离(|x-y|)。(这也是真的!9倍实际距离实际上就是这种算法最坏的情况)

Farmer John想去验证这个结果。已知x和y,请编程计算他找到Bessie所行走的距离。

输入输出格式

输入格式:(lostcow.in)

一行个数据 x和y。

输出格式:(lostcow.out)

一个数据,表示Farmer John将前往Bessie的距离。

输入输出样例

输入样例:

3 6

输出样例:

9

数据范围

0<=x,y<=1000

这就是一道模拟,一步一步移动,在移动过程中判断是否到达。

#include<bits/stdc++.h>

using namespace std;

int x,y,a[15]={0,1,-2,4,-8,16,-32,64,-128,256,-512,1024,-2048,4098},j=0,s=0;

void work(int t)

{

s++;

if (t==y)

{

cout<<s<<endl;

exit(0);

}

}

int main()

{

freopen("lostcow.in","r",stdin);

freopen("lostcow.out","w",stdout);

scanf("%d%d",&x,&y);

y-=x;

x=0;

while (1)

{

j++;

if (a[j-1]<a[j])

for (int i=a[j-1]+1;i<=a[j];++i)

work(i);

else

for (int i=a[j-1]-1;i>=a[j];--i)

work(i);

}

return 0;

}

而我的方法做了一个很玄学的操作:我用一个a数组用来存它每一步移动后离起点的距离,因为它都是2的幂,而且数据规模也很小,所以我才会想到这个方法。然后我假设它的起点为0,我就可以直接加减。所以我对它的输入数据进行了一波操作,把起点变为原点,终点也随之改变,这样就成了一条数轴。可是,主要是方向有反,它又要求一步一步移动,所以循环应该有顺有倒,所以我才用了一个函数,方便一点。