农夫知道一头牛的位置,想要抓住它。
农夫和牛都位于数轴上,农夫起始位于点 NN,牛位于点 KK。
农夫有两种移动方式:

  1. 从 XX 移动到 X−1X−1 或 X+1X+1,每次移动花费一分钟
  2. 从 XX 移动到 2∗X2∗X,每次移动花费一分钟

假设牛没有意识到农夫的行动,站在原地不动。
农夫最少要花多少时间才能抓住牛?

输入格式

共一行,包含两个整数N和K。

输出格式

输出一个整数,表示抓到牛所花费的最少时间。

数据范围

0≤N,K≤1050≤N,K≤105

输入样例:

5 17

输出样例:

4


  1. #include <iostream>
  2. #include <cstring>
  3. #include <algorithm>
  4. using namespace std;
  5. const int N = 1e5+10;
  6. int dist[N];
  7. int q[N];
  8. int n,k;
  9. int bfs() {
  10. int hh = 0, tt = 0;
  11. q[0] = n;
  12. memset(dist,-1,sizeof dist);
  13. dist[n] = 0;
  14. while (hh <= tt) {
  15. int t = q[hh++];
  16. if (t == k) return dist[t];
  17. if (t + 1 < N && dist[t+1] == -1) {
  18. dist[t+1] = dist[t]+1;
  19. q[++tt] = t + 1;
  20. }
  21. if (t * 2 < N && dist[t*2] == -1) {
  22. dist[t*2] = dist[t] + 1;
  23. q[++tt] = t * 2;
  24. }
  25. if (t - 1 >= 0 && dist[t-1] == -1) {
  26. dist[t-1] = dist[t] + 1;
  27. q[++tt] = t - 1;
  28. }
  29. }
  30. return -1;
  31. }
  32. int main() {
  33. cin >> n >> k;
  34. cout << bfs() << endl;
  35. return 0;
  36. }