分析
-
我们可以发现N的变化的过程中不可能变为负数,如果变为负数的话,只有通过
N=N+1
才能变为正数,花费的时间变长。 -
如果
N>K
,我们只能用过-1
得到结果,否则我们可以通过三者的组合得到K,并且在过程中数据大小不会超过K+1。 -
题目是一定有解的,因为最差我们可以挺过
+1
或者-1
得到结果。
#include <iostream>
#include <cstring>
using namespace std;
const int N = 1e5 + 10;
int n, k;
int q[N];
int dist[N];
int bfs() {
memset(dist, -1, sizeof dist);
dist[n] = 0;
q[0] = n;
int hh = 0, tt = 0;
while (hh <= tt) {
int t = q[hh++];
if (t == k) return dist[k];
if (t + 1 < N && dist[t + 1] == -1) {
q[++tt] = t + 1;
dist[t + 1] = dist[t] + 1;
}
if (t - 1 >= 0 && dist[t - 1] == -1) {
q[++tt] = t - 1;
dist[t - 1] = dist[t] + 1;
}
if (t * 2 < N && dist[t * 2] == -1) {
q[++tt] = t * 2;
dist[t * 2] = dist[t] + 1;
}
}
return -1;
}
int main() {
cin >> n >> k;
cout << bfs() << endl;
return 0;
}