Farmer John has been informed of the location of a fugitive cow and wants to catch her immediately. He starts at a point N (0 ≤ N ≤ 100,000) on a number line and the cow is at a point K (0 ≤ K ≤ 100,000) on the same number line. Farmer John has two modes of transportation: walking and teleporting.
* Walking: FJ can move from any point X to the points X - 1 or X + 1 in a single minute
* Teleporting: FJ can move from any point X to the point 2 × X in a single minute.
If the cow, unaware of its pursuit, does not move at all, how long does it take for Farmer John to retrieve it?
Line 1: Two space-separated integers:
N and
K
Output
Line 1: The least amount of time, in minutes, it takes for Farmer John to catch the fugitive cow.
Sample Input
5 17Sample Output
4
农夫约翰被通知,他的一只奶牛逃逸了!所以他决定,马上幽发,尽快把那只奶牛抓回来.
他们都站在数轴上.约翰在N(O≤N≤100000)处,奶牛在K(O≤K≤100000)处.约翰有
两种办法移动,步行和瞬移:步行每秒种可以让约翰从z处走到x+l或x-l处;而瞬移则可让他在1秒内从x处消失,在2x处出现.然而那只逃逸的奶牛,悲剧地没有发现自己的处境多么糟糕,正站在那儿一动不动.
那么,约翰需要多少时间抓住那只牛呢?
代码
- #include <iostream>
- #include <cstdio>
- #include <cstring>
- #include <algorithm>
- #include <queue>
- #include <vector>
- using namespace std;
- const int MAXN=500001;
- bool visit[MAXN];
- vector <int> Q;
- struct xx
- {
- int s,cnt;
- }a[MAXN];
- int main(int argc, char *argv[])
- {
- int n,k,head,tail,d=0,zt,i;
- scanf("%d%d",&n,&k);
- a[1].s=n;
- head=1,tail=1;
- while(head<=tail)
- {
- zt=tail;
- for(i=head;i<=tail;i++)
- {
- if(a[i].s==k) {
- printf("%d\n",a[i].cnt);
- return 0;
- }
- if(a[i].s+1<MAXN)
- if(visit[a[i].s+1]==false)
- {
- zt++;
- a[zt].s=a[i].s+1;
- a[zt].cnt=a[i].cnt+1;
- visit[a[zt].s]=true;
- }
- if(a[i].s-1>=0)
- if(visit[a[i].s-1]==false)
- {
- zt++;
- a[zt].s=a[i].s-1;
- a[zt].cnt=a[i].cnt+1;
- visit[a[zt].s]=true;
- }
- if(a[i].s*2<MAXN)
- if(visit[a[i].s*2]==false)
- {
- zt++;
- a[zt].s=a[i].s*2;
- a[zt].cnt=a[i].cnt+1;
- visit[a[zt].s]=true;
- }
- head=tail+1;
- tail=zt;
- }
- }
- return 0;
- }