无脑spfa
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <queue>
using namespace std;
const int maxn=20020;
int n,m;
struct Edge
{
int to,next;
}edge[maxn*5];
int Adj[maxn],Size;
void init_edge()
{
Size=0; memset(Adj,-1,sizeof(Adj));
}
void Add_Edge(int u,int v)
{
edge[Size].next=Adj[u];
edge[Size].to=v;
Adj[u]=Size++;
}
int dist[maxn],cQ[maxn];
bool inQ[maxn];
bool spfa()
{
memset(dist,63,sizeof(dist));
memset(cQ,0,sizeof(cQ));
memset(inQ,false,sizeof(inQ));
dist[n]=0;
queue<int> q;
inQ[n]=true;q.push(n); cQ[n]=1;
while(!q.empty())
{
int u=q.front();q.pop();
for(int i=Adj[u];~i;i=edge[i].next)
{
int v=edge[i].to;
if(dist[v]>dist[u]+1)
{
dist[v]=dist[u]+1;
if(!inQ[v])
{
inQ[v]=true;
cQ[v]++;
if(cQ[v]>=maxn) return false;
q.push(v);
}
}
}
inQ[u]=false;
}
return true;
}
int main()
{
scanf("%d%d",&n,&m);
if(n>m)
{
printf("%d\n",n-m);
return 0;
}
/// build graph
init_edge();
for(int i=1;i<=10000;i++)
{
if(2*i<maxn) Add_Edge(i,2*i);
if(i-1>0) Add_Edge(i,i-1);
}
spfa();
printf("%d\n",dist[m]);
return 0;
}