AcWing 1775. 丢失的牛
题目链接
题目描述
农夫约翰丢掉了他最宝贵的奶牛贝茜,他需要找到她!
幸运的是,农场只有一条长长的小路,约翰知道贝茜一定在这条小路上的某个地方。
如果我们将这条路看作一个数轴,那么约翰当前位于位置 x,贝茜当前位于位置 y(约翰不知道其具体位置)。
如果约翰知道贝茜所处的具体位置,那么只需直接朝她走去,找到她只需行进 |x−y| 的距离。
不幸的是,外面很黑,农夫约翰什么也看不见。
他找到贝茜的唯一办法就是来回走动,直到他最终到达她的位置。
为了找出在搜索过程中来回走动的最佳策略,约翰查阅了计算机科学研究文献,发现这个确切的问题不仅在过去被计算机科学家研究过,而且它实际上被称为“丢失的奶牛问题”(这是真的!)。
农民约翰找到贝茜的推荐行动方式是首先移动到位置 x+1,然后反向移动到位置 x−2,然后移动到位置 x+4,依此类推,以“之字形”模式,每一次移动到的位置与初始位置之间的距离都是上一次移动到的位置与初始位置之间的距离的两倍。
正如他在研究解决丢失奶牛问题的算法时了解到的那样,这种方法保证了在最坏的情况下,找到贝茜之前,他需要行进 9 倍于他与贝茜之间的直接距离的路程。(事实上,相比于其他策略的最坏情况,9 倍于实际距离已经是最好的了)
农夫约翰很想验证这个结果。
给定 x 和 y,请根据上面的“之字形”搜索策略计算直到找到贝茜为止,他将要行进的总距离是多少。
输入格式
共一行,包含两个整数 x,y。
输出格式
输出一个整数,表示总行进距离。
数据范围
0≤x,y≤1000
输入样例:
3 6
输出样例:
9
思路
模拟整个过程
AC代码
//约翰位于x,贝茜位于y
//先x+1,后反向x−2,后x+4,后x-8
//找出规律x+k*2*foot,foot步数,k=1或者-1代表正向或者反向
#include<bits/stdc++.h>
using namespace std;
const int N=1100;
int main()
{
int x,y;
cin>>x>>y;
int dis=0,k=1,foot=1;
//初始化路程为0,首先正向移动,第一步步数为1
while(1) //写死循环,直到符合条件才输出
{
if(k==1&&x<=y&&(y-x)<=foot)
//这次x正方向移动,x在y左边,
//但x与y的距离小于该次步数,说明x这次移动过程中碰见y
{
dis+=y-x;
cout<<dis<<endl;
return 0;
}
else if(k==-1&&y<=x&&(x-y)<=foot)
//这次x负方向移动,x在y右边,
//但x与y的距离小于该次步数,说明x这次移动过程中碰见y
{
dis+=x-y;
cout<<dis<<endl;
return 0;
}
else
//x无法碰见y
{
foot*=2; //下一步数*2
dis+=foot; //路程加上该步数
k*=-1; //方向变化
}
}
return 0;
}