给定一个正整数 nn,我们希望你可以通过一系列的操作,将其变为另一个正整数 mm。
操作共分两种:
- 将当前的数乘以 22。
- 将当前的数减去 11。
要求,在变换过程中,数字始终为正。
请你计算,所需要的最少操作次数。
输入格式
一行,两个不同的正整数 nn 和 mm。
输出格式
一个整数,表示所需的最少操作次数。
数据范围
前 66 个测试点满足 1≤n,m≤101≤n,m≤10。
所有测试点满足 1≤n,m≤100001≤n,m≤10000。
输入样例1:
4 6
输出样例1:
2
输入样例2:
10 1
输出样例2:
9
代码如下:
#include<iostream>
#include<queue>
#include<algorithm>
#include<cstring>
using namespace std;
int n, m;
struct point{
int x;
int step=0;
};
queue<point> r;
int vis[200010];
int main()
{
ios::sync_with_stdio(false);
cout.tie(NULL);
memset(vis, 0, sizeof(vis));
cin >> n >> m;
point start;
start.x = n;
start.step = 0;
vis[n] = 1;
r.push(start);
while(!r.empty())
{
int xx = r.front().x;
if(xx == m){
cout<< r.front().step;
break;
}
for(int i = 0; i < 2; i ++)
{
int y;
if(i == 0 && xx < m) y = 2 * xx;
else{
y = xx - 1;
if(y <= 0){
continue;
}
}
if(vis[y] == 0){
point temp;
temp.x = y;
temp.step = r.front().step + 1;
vis[y] = 1;
r.push(temp);
}
}
r.pop();
}
return 0;
}