题意:

解法:
令d[i]表示x变成i需要的最小操作次数,
由于数据较大,所以dp数组用map开,
然后就是要保证状态数较小,否则map不管用.
转移方程:
1.i%2==0,d[i]=min(d[i],d[i/2]+1).
2.i%2==1,d[i]=min(d[i],d[(i+1)/2]+2),d[i]=min(d[i],d[(i-1)/2+2]).
这种转移方程的好处:
因为所有转移方程都对i有除2操作,所以递归层数应该接近O(log)
code:
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int maxm=2e3+5;
map<int,int>d;
int x,y;
int dfs(int k){
if(x==k)return 0;
if(x>k)return x-k;
if(d.count(k))return d[k];
d[k]=k-x;
if(k%2==0){
d[k]=min(d[k],dfs(k/2)+1);
}else{
d[k]=min(d[k],dfs((k-1)/2)+2);
d[k]=min(d[k],dfs((k+1)/2)+2);
}
return d[k];
}
signed main(){
ios::sync_with_stdio(0);
cin>>x>>y;
cout<<dfs(y)<<endl;
return 0;
}