/*题意:一个数,就是输入的第一个数,让它变成第二个数最少用几步。可以点红色按钮,蓝色按钮来改变数字,红色:*2,蓝色:-1,如果变成负数,
就变成原来的数。
CF 520 B. Two Buttons
思路:当然是*2可以掠过的步数更少啦,如果n是输入,m是输出。
如果n大于m,不能使用红色按钮,很容易看出,步数就是n-m。
如果n比m小,如果m是偶数的话,m/2,如果m是奇数,m+1,这样一直循环判断n是不是还比m小,不符合就跳出循环,进入第一个如果。*/
/*正向BFS #include<iostream> #include<queue> #include<string.h> #define ll long long using namespace std; ll n, m, cnt; ll vis[20000005], ans[20000005]; queue<ll>a; int main() { while (cin >> n >> m) { memset(vis, 0, sizeof(vis)); memset(ans, 0, sizeof(vis)); while(!a.empty()) a.pop(); cnt = 0; if (n >= m) cout << n - m << endl; else { a.push(n); while (!a.empty()) { ll x = a.front(); a.pop(); if (x == m) { cnt = ans[x]; break; } if (x <= 2*m && x - 1 >= 0 && vis[x] == 0) { a.push(x - 1); ans[x - 1] = ans[x] + 1; } if (x <= 2*m && x != 0 && vis[x] == 0) { a.push(x * 2); ans[x * 2] = ans[x] + 1; } vis[x] = 1; } cout << cnt << endl; } } return 0; } */ //逆向规律模拟 #include<iostream> #include<algorithm> #include<string.h> #include<math.h> #define ll long long using namespace std; ll a, b, ans; int main() { while (cin >> a >> b) { ans = 0; if (a >= b) ans = a - b; else { while (a < b) { if (b % 2) { ans++; b++; } else { ans++; b /= 2; } } ans += abs(a - b); } cout << ans << endl; } return 0; }