题目描述
Farmer John最珍贵的奶牛Bessie丢了,他需要把它找回来。
幸运的是,农场里只有一条长长的直路,他知道Bessie肯定在这条路上的某个地方。如果我们把这条路看成数轴,假设Farmer John所在位置是x,Bessie所在的位置是y(对于John是未知的),如果Farmer John知道Bessie的位置,那么他就可以直接走过去,步行的距离是|x-y|.但不幸的是,外面非常黑,Farmer John什么都看不见,他只能沿着路来来回回的走直到他最终遇到Bessie。
为了找到最佳的寻找Bessie的方法,Farmer John参考了一些计算机科学研究文献,发现计算机科学家们确实研究过“丢失的奶牛”的问题。文献中建议Farmer John找到Bessie的解决方案是:
Farmer John先从初始位置x,走到x+1的位置,然后反方向走到x-2的位置,然后在调走走到x+4位置,等等。这种模式为成为“Z字形”模式,这种模式中,每一步达到的位置与初始位置的距离差都是上一步的两倍。这种方法表示,最坏的情况下他需要走9倍的|x-y|的直线距离才能找到Bessie。
Farmer John对这个结果非常好奇,现在给定x和y,请计算出如果采用这种"Z字形"模式,Farmer John在找到Bessie前,他一共需要走的路程的总距离。
输入格式
输入是一行,包含两个用空格隔开的整数,分别代表x和y。x和y的范围都是0~1000
输出格式
输出仅一行,表示在找到Bessie前,Farmer John一共需要走的路程的总距离。
输入输出样例
输入样例1:
3 6
输出样例1:
9
【耗时限制】1000ms 【内存限制】128MB
首先,这题应该用模拟的方法来解决,可以模拟Farmer John的行走路径,再算路程总和
代码:
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
LL x,y,cnt=0;
int main()
{
cin>>x>>y;
LL end=9*abs(x-y),num=1,x1=x,h=0;
while(cnt<=end){ //这里也可以写死循环
h=x+num;
if(y>=x1&&y<=h){cnt+=abs(y-x1);break;}
else cnt+=abs(h-x1);
x1=h;
num*=-2;
//分界线,上面是正,下面是负
h=x+num;
if(y<=x1&&y>=h){cnt+=abs(y-x1);break;}
else cnt+=abs(h-x1);
x1=h;
num*=-2;
}
cout<<cnt;
return 0;
}
标签:cnt,x1,K11505,cow,USOpen,位置,Farmer,Bessie,John
From: https://blog.csdn.net/2301_79502610/article/details/140798875